C++ 向MPI中的多个进程发送Recv的最佳方式
我的具体问题如下: 假设我有4个工人和1个主流程。我想从每个工作人员向所有其他工作人员发送消息。从工人1到2,3,4;从过程2到1、3、4等 我不关心消息的发送顺序,但我关心性能。我发送的数据非常大,可能是千兆字节 我目前正在使用Isend和Recv,但不断出现分段错误。我试图使用森德雷夫,但那些似乎只是悬在中间,可能是由于死锁。所以我想知道什么是发送和接收多个进程的最佳方式 这是我目前的代码:C++ 向MPI中的多个进程发送Recv的最佳方式,c++,debugging,parallel-processing,mpi,C++,Debugging,Parallel Processing,Mpi,我的具体问题如下: 假设我有4个工人和1个主流程。我想从每个工作人员向所有其他工作人员发送消息。从工人1到2,3,4;从过程2到1、3、4等 我不关心消息的发送顺序,但我关心性能。我发送的数据非常大,可能是千兆字节 我目前正在使用Isend和Recv,但不断出现分段错误。我试图使用森德雷夫,但那些似乎只是悬在中间,可能是由于死锁。所以我想知道什么是发送和接收多个进程的最佳方式 这是我目前的代码: for(int id = 1; id < num_processes; id++) {
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);
}
感谢您的帮助 如果您遇到SEGFULTS,您可能会遇到一些问题,而不是优化数据传输。你可能在其他地方也有问题。您可能需要尝试调试器来找出发生了什么。你可以在这里看到关于MPI调试的大文章。如果您特别想要一个免费的调试器,您可以始终使用GDB查看您是否不知道如何执行此操作。您描述的数据模式是MPI_Alltoall或MPI_Alltoallv。你为什么不使用该集合进行此操作?谢谢!如果要发送的向量具有不同的长度,是否有效?似乎alltoall为所有进程发送相同的长度。MPI_Alltoallv用于大小不同的向量。还要注意,MPI_Recv的最后一个参数的类型是MPI_Status,而不是MPI_Request。也许你想改用MPI_Irecv。