如果匹配MPI_IRecv需要较少的数据元素,MPI_Send会阻塞吗?

时间:2013-05-02 18:08:48

标签: parallel-processing mpi distributed-computing

假设以下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也不会阻塞?

感谢。

1 个答案:

答案 0 :(得分:2)

MPI_Send将阻止...这是一个阻止呼叫。当调用应用程序可以安全地读取/修改发送/接收缓冲区时,将返回“阻塞”调用。不保证匹配的MPI_ [I] recv调用。

MPI库对应用程序中缓冲区的读/写状态一无所知。 MPI标准要求应用程序对消息缓冲区的稳定性做出某些保证。