2013-08-23 47 views
1

我对于何时应该调用MPI_Wait(或其他变体,如:MPI_Waitall,MPII_Waitsome等)有点困惑。请考虑以下几种情况:(注:伪代码)MPI_wait何时需要使用非阻塞呼叫?

案例(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更好吗?

+1

由于此问题已在SciComp上得到解答(http://scicomp.stackexchange.com/questions/8308/when-is-mpi-wait-necessary-for-non-blocking-calls),您应该关闭此问题。不需要重复的答案。 –

+2

已经在这里询问:http://scicomp.stackexchange.com/questions/8308/when-is-mpi-wait-necessary-for-non-blocking-calls – GradGuy

回答

0

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

在你的情况下,MPI_Probe将阻塞,直到收到一条消息。所以我想说,你的电话到MPI_Probe是没有必要在你的情况。