【问题标题】:Using C++ OpenMPI to send and receive a list between master/slave process使用 C++ OpenMPI 在主/从进程之间发送和接收列表
【发布时间】:2016-10-13 02:51:53
【问题描述】:

我正在尝试在主从之间来回发送std::list<int>。但我不确定如何创建 MPI 数据类型并将列表传递给从站。我想在不使用像boost 这样的另一个库的情况下做到这一点。我正在尝试解决这个post,但我无法使用list。下面是我正在使用的代码。

#include <iostream>
#include <list>
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(int argc, char **argv)
{
int rank, size, tag, rc, i;
MPI_Status status;
char message[20];
char new_message[20];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
tag=7;

if (rank==0) {
    strcpy(message, "Hello, world");
    for (int i=1; i<size; ++i){
        list<int> rand_list;
        list<int>::iterator it = rand_list.end();
        list<int> *lt_ptr = &rand_list;
        for(int j = 0; j < 5; ++j)
        {
             int r;
             r = rand();
             rand_list.push_front(r);
             it++;
        }
        //Instead of sending the string I'd like to send the list of random ints
        MPI_Send(message, 13, MPI_CHAR, i, tag, MPI_COMM_WORLD);
        MPI_Recv(new_message, 13, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status);
        cout << "master: " << new_message << endl;
        }
}
else{
   // slaves processes
   rc = MPI_Recv(message, 13, MPI_CHAR, 0, tag, MPI_COMM_WORLD, &status);
   cout << "node " << rank << ": " << message << endl;
   strcpy(new_message, "Goodbye, world");
   // code to manipulate the lists and send back to the master process
   rc = MPI_Send(new_message, 13, MPI_CHAR, 0, tag, MPI_COMM_WORLD);
   }
MPI_Finalize();
}

以下是我用来编译和运行的命令。

mpic++ mpi_prog.cpp -o mpi_prog.o
mpirun -np 5 mpi_prog.o

【问题讨论】:

  • 如果您只使用std::vector&lt;int&gt; 而不是std::list&lt;int&gt;,这将变得微不足道。发送缓冲区为&amp;rand_vec[0],计数为rand_vec.size()。是否特别需要使用列表?

标签: c++ list openmpi


【解决方案1】:

发送列表的最简单方法可能是发送列表的长度(您拥有的长度为 5),然后循环遍历元素一个一个地发送它们。这样做的性能会很差,但由于许多原因,使用列表可能是一个有问题的设计选择。

由于您还在 master 中逐个循环处理流程,向它们发送每个不同的数字,因此整体上不同的设计可能会更好地为您服务。对于您的特定用例,如何在实际使用它们的进程上并行生成随机数。有专门设计的并行随机数生成算法和先进的随机数生成器,您可以告诉每个从站在流中向前跳过多远,以免它们重叠。

【讨论】:

    【解决方案2】:

    为什么要在这里使用std::liststd::vector 似乎更合适,数据是连续存储的,它应该直接与 MPI 一起使用。你把事情复杂化了,顺便说一句,你更喜欢使用std::uniform_int_distribution 而不是std::rand

    填充随机向量的主代码应该是这样的:

    std::vector<int> v(5);
    std::random_device rd;
    std::mt19937 gen(rd()); // mersenne twister engine
    std::uniform_int_distribution<> dis;
    std::generate(v.begin(), v.end(), [&](){ return dis(gen); }); // fill the vector with random values
    

    您的主节点可以直接在 MPI 中调用:

    MPI_Send(&v[0], v.size(), MPI_INT, i, tag, MPI_COMM_WORLD);
    

    从节点代码:

    MPI_Recv(&v[0], v.size(), MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
    

    我不确定这是你想要做的。您的主节点将使用随机值初始化size 不同的向量,并将它们中的每一个发送到一个从节点。从站接收到的每个向量都是不同的。对吗?

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多