假设以下MPI代码。
MPI_Comm_Rank(MPI_COMM_WORLD, &rank);
if (rank == 0){
MPI_Send(a, count, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
MPI_Send(b, count, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
}
else if (rank == 1){
MPI_IRecv(a, 1, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &req);
MPI_Recv(b, count, MPI_CHAR, 0, 0, MPI_COMM_WORLD);
MPI_Wait(&req, &status);
}
说第一个MPI_Send(a, count, ...)
不会阻止,即使匹配的MPI_IRecv(a, 1, ...)
只是从缓冲区中读取一个元素,这是正确的吗?
此外,由于没有对缓冲区a
进行读/写操作,它是否正确即使在MPI_Wait
之后没有直接调用MPI_IRecv
,进程1也不会阻塞?
感谢。
答案 0 :(得分:2)
MPI_Send将阻止...这是一个阻止呼叫。当调用应用程序可以安全地读取/修改发送/接收缓冲区时,将返回“阻塞”调用。不保证匹配的MPI_ [I] recv调用。
MPI库对应用程序中缓冲区的读/写状态一无所知。 MPI标准要求应用程序对消息缓冲区的稳定性做出某些保证。