2010-12-03 67 views
24

我在MPI中實現了一個程序,其中主進程(rank = 0)應該能夠接收來自其他進程的請求,這些進程請求僅由根。 如果我使MPI_Recv(...)的級別爲0,我必須指定向root發送請求的進程的級別,但我無法控制它,因爲進程沒有按1,2的順序運行, 3,.... 如何接收來自任何等級的請求並使用發送過程的號碼向其發送必要的信息?來自未知源的MPI recv

回答

44

這裏假定您使用的是C語言。在C++和Fortran中有類似的概念。您只需在MPI_recv()中指定MPI_ANY_SOURCE作爲源。狀態結構包含消息的實際來源。

int buf[32]; 
MPI_Status status; 
// receive message from any source 
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
int replybuf[]; 
// send reply back to sender of the message received above 
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD); 
+0

非常感謝!我不知道它,但非常有用 – shkk 2010-12-03 20:09:55

2

MPI_ANY_SOURCE是顯而易見的答案。

但是,如果所有等級都將發送排名爲0的請求,那麼MPI_Irecv與MPI_Testall結合使用也可能會作爲模式。這將允許以任何順序執行MPI_Send調用,並且可以按照MPI_Irecv調用匹配的順序來接收和處理該信息。

相關問題