MPI中向多个进程发送Recv的最佳方式

Optimal Way to Send Recv to multiple processes in MPI

本文关键字:Recv 最佳 方式 进程 MPI      更新时间:2023-10-16

我的具体问题如下:假设我有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);
}

感谢您的帮助!

如果您遇到segfault,您的问题可能不是优化数据传输。你可能在其他地方也有问题。你可能想试试调试器来了解发生了什么。你可以在这里看到关于MPI调试的大文章(我如何调试MPI程序?)。如果你特别想要一个免费的调试器,你可以一直使用GDB(如果你不知道如何做到这一点,请参阅这个答案)。