使用一个单一缓冲区在MPI中发送/接收多个消息是否可行?

3

我正在学习MPI,不知道是否可以使用同一个数组发送或接收多个消息。

每个处理器都需要向其他处理器发送其本地数据的不同部分(也需要接收其他处理器的数据)。

假设我有四个处理器。我使用以下代码:

MPI_Request sendReqs[4];
MPI_Status sendStats[4];
MPI_Request recReqs[4];
MPI_Status recStats[4];

// locData is an array of integers. I need to distribute chunks of it
// assume I have four processors 
for( i = 0 ; i < 4; i++) {
    send  = locData + indices[2*i]; // location at buffer to start ith send
    count = indices[2*i+1] - indices[2*i] + 1; // how many we send to i 
    MPI_Isend(send, count, MPI_INT, i, rank, MPI_COMM_WORLD, sendReqs[i] );
}

同样地,这个可以吗?
// gatheredData is where each processor stores data it gets form others
// assume I have four processors 
for( i = 0 ; i < 4; i++) {
    start = gatheredData + gatheredIndices[2*i];
    count = gatheredIndices[2*i+1] - gatheredIndices[2*i] + 1;
    MPI_Irecv(start, count, MPI_INT, i, i, MPI_COMM_WORLD, &recReqs[i]);
 }

我结束这个通话,以确保每个人都得到了数据。
MPI_Waitall(4, sendReqs, sendStats);
MPI_Waitall(4, recReqs , recStats );

这行代码无法正常工作 - 处理器显示gatheredData内部包含一些垃圾值(以及一些正常的值)。


3
这看起来很像你试图自己实现一个全对全的集体通信。你应该能够使用 MPI_AlltoallMPI_Alltoallv 来代替。参见这里:http://www.mpich.org/static/docs/v3.1/www3/MPI_Alltoall.html 和 http://www.mpich.org/static/docs/v3.1/www3/MPI_Alltoallv.html - Patrick
谢谢!我认为那应该可以了。 - Yair Daon
3
你原来的问题的答案是:只要不重叠,使用同一个缓冲区是可以的。最终,整个过程中的内存可以被看作是一个单一的“缓冲区”,可以这么说。 - Hristo Iliev
1个回答

2
任何点对点发送操作都可以使用与任何其他发送相同的缓冲区,因为它们不会修改缓冲区的内容。
在接收端,如果你不能保证每个接收操作有一个缓冲区,该缓冲区与任何其他发送或接收所使用的缓冲区不重叠,那么结果是未定义的,并且可能导致程序崩溃。 只要gatheredIndices中不存在重叠,你使用MPI_Irecv的代码看起来就很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接