非阻塞调用何时需要MPI_wait?

时间:2013-08-23 19:38:46

标签: c mpi hpc

当我应该调用MPI_Wait(或其他变体,如:MPI_Waitall,MPII_Waitsome等)时,我有点困惑。请考虑以下情况:(注意:伪代码)

案例(1)

MPI_Isend (send_buffer, send_req);    
// Do local work
MPI_Probe (recv_msg);
MPI_Irecv (recv_buffer, recv_req);
// wait for msgs to finish
MPI_Wait (recv_req);   // <--- Is this needed?
MPI_Wait (send_req);   // <--- How about this?

因此,在这种情况下,我的困惑源于MPI_Probe。由于这是一个阻塞调用,这本质上是否意味着它会阻止调用者直到收到消息?如果是这种情况,那么我认为这里不需要MPI_Waits。

以下情况怎么样?

案例(2)

MPI_Isend (send_buffer, send_req);    
// Do local work
MPI_Probe (recv_msg);
MPI_Recv (recv_buffer);
// wait for msgs to finish
MPI_Wait (send_req);   // <--- Is this necessary?

与第一种情况类似,但MPI_Irecv被其阻止版本取代。在这种情况下,在MPI_Wait被调用的时间肯定会收到消息,这意味着MPI_Isend必须已经完成...

另外,作为一个单独的问题,当我们说MPI_Probe阻止时,我们的意思是什么?是否阻止该进程收到所有消息,或者仅阻止直到收到“元数据”(如msg大小,发送者等级等)?换句话说,MPI_Probe + MPI_Irecv优于MPI_Probe + MPI_Recv

1 个答案:

答案 0 :(得分:0)

只有当您想要异步接收数据时,如果启动了各种异步读取,则需要使用“MPI_Wait”函数或MPI_Waitall。问题是MPI_Wait是一个阻塞调用。如果你想要非阻塞,你应该使用MPI_Test来检查你的功能是否完成。

在您的情况下,MPI_Probe将阻止,直到收到消息。所以我想说你的MPI_Probe调用不是必需的。

相关问题