【发布时间】:2013-07-23 06:26:55
【问题描述】:
我的具体问题如下: 假设我有 4 个工人和 1 个主进程。我想将每个工人的消息发送给所有其他工人。 (从工人1到2,3,4;从进程2到1,3,4等)
我不关心消息发送的顺序,但我关心性能。我发送的数据非常大,可能以千兆字节为单位。
我目前正在使用 Isend 和 Recv,但不断收到分段错误。我尝试使用 Sendrecv,但那些似乎只是挂在中间,可能是由于死锁。所以我想知道在多个进程之间发送和接收的最佳方式是什么。
这是我当前的代码:
for(int id = 1; id < num_processes; id++) {
// Some computation with the vector vec //
MPI_Request request;
if(id != myId)
MPI_Isend(&vec.front(), vec.size(), mpi_bid, id, 1, MPI_COMM_WORLD, &request);
}
然后用于接收。
for(int id = 1; id < num_processes; id++) {
MPI_Request request2;
if(id != myID)
MPI_Recv(&recvVec.front(), some_large_value, mpi_bid, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &request2);
}
感谢任何帮助!
【问题讨论】:
-
您描述的数据模式是 MPI_Alltoall 或 MPI_Alltoallv。您为什么不使用该集体进行此操作?
-
谢谢!如果我要发送的矢量有不同的长度,它会起作用吗?似乎 alltoall 为所有进程发送相同的长度。
-
MPI_Alltoallv用于不同大小的向量。还要注意MPI_Recv的最后一个参数是MPI_Status类型而不是MPI_Request。也许您打算改用MPI_Irecv。
标签: c++ debugging parallel-processing mpi