Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向MPI中的多个进程发送Recv的最佳方式_C++_Debugging_Parallel Processing_Mpi - Fatal编程技术网

C++ 向MPI中的多个进程发送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++) {

我的具体问题如下: 假设我有4个工人和1个主流程。我想从每个工作人员向所有其他工作人员发送消息。从工人1到2,3,4;从过程2到1、3、4等

我不关心消息的发送顺序,但我关心性能。我发送的数据非常大,可能是千兆字节

我目前正在使用Isend和Recv,但不断出现分段错误。我试图使用森德雷夫,但那些似乎只是悬在中间,可能是由于死锁。所以我想知道什么是发送和接收多个进程的最佳方式

这是我目前的代码:

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。