1

我对何时应该调用 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阻塞时,我们的意思是什么?它会阻塞直到进程收到所有消息,还是仅阻塞直到收到“元数据”(例如消息大小、发件人等级等)?换句话说,MPI_Probe+MPI_IrecvMPI_Probe+更好MPI_Recv吗?

4

1 回答 1

0

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

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

于 2013-09-27T11:22:25.677 回答