【发布时间】:2015-07-27 16:21:02
【问题描述】:
MPI 标准规定,一旦将缓冲区分配给非阻塞通信函数,在操作完成之前(即,直到成功的 TEST 或 WAIT 函数之后),应用程序才被允许使用它。
这是否也适用于以下情况:
我有一个缓冲区,其中的每一部分都将转到不同的处理器,例如,其中一部分将从处理器本身可用的数据中复制。
我是否允许在每个处理器上 MPI_Irecv 来自其他处理器的缓冲区的不同部分,复制处理器中可用的部分,然后 MPI_Isend 应该去其他处理器的数据,做我的其他计算,然后 MPI_Waitall所以我的发送和接收完成了吗?
n=0;
for (i = 0; i < size; i++) {
if (i != rank) {
MPI_Irecv(&recvdata[i*100], 100, MPI_INT, i, i, comm, &requests[n]);
n++;
}
}
process(&recvdata[rank*100], 100);
for (i = 0; i < size; i++) {
if (i != rank) {
MPI_Isend(&senddata[i*100], 100, MPI_INT, i, rank, comm, &requests[n]);
n++;
}
}
MPI_Waitall(n, requests, statuses);
【问题讨论】:
-
只要
senddata[]和recvdata[]不重叠,代码就完美了。
标签: mpi nonblocking