2014-01-26 86 views
0

我有一個應用程序,其中每個處理器需要發送數據到特定數量的處理器,並從未知數量的未知數據大小的處理器接收數據,而這些處理器都是在執行本地操作的同時。這是我的想法:MPI_Iprobe何時會返回true?

MPI_Isend(...) 
// Do local computation 
MPI_Wait(...) 

int flag; 
MPI_Status st; 
MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st); 
While(flag) { 
    MPI_Irecv(st.MPI_SOURCE,...); 
    MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st); 
} 

我保證說MPI_Iprobe在這種情況下,將能夠找到發送的消息的每一個?我懷疑如果當前的等級有更少的工作要做,它會在其他處理器有足夠的時間來實際發送消息之前達到MPI_Iprobe,在這種情況下,我會錯過一些消息。那樣的話,MPI_Wait之後會用MPI_Barrier來解決問題嗎?

還有什麼其他選擇可以解決這個問題?

回答

1

除非我誤解了你的問題,否則你可以使用常規的MPI_PROBE。這將阻止等待消息實際到達。

但是,我不確定你爲什麼需要使用探針。從你的示例代碼看來,使用MPI_RECVMPI_ANY_SOURCE可以很好地工作。 MPI_RECV不需要命名來源。

+0

問題是單個消息的數量,它們的來源和所有消息大小都是未知的。這意味着我不能使用'MPI_Probe'(我想),因爲我無法知道應該多少次調用它。如果我不必要地稱它,那麼這個過程將永遠停滯!至於接收,我使用'MPI_Irec'來允許計算/通信重疊。令我困惑的是我並不完全知道'MPI_Iprobe'確定消息已經「到達」 – GradGuy

相關問題