2013-08-23 76 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是沒有必要在你的情況。