2015-06-13 40 views
1

有沒有辦法檢查一些進程是否正在等待MPI_Recv?MPI反向探針

我有一個root proc和一些slave進程。

從psedo代碼:

while (1) { 
    do_some_stuff; // calls MPI_Test and clear unused buffers 
    MPI_Recv(buf, ...); 
    do_something_with_buf; 
    MPI_Isend(buf2, ...); // possibly many sends depending on what was in buf 
} 

如果所有從進程,掛在MPI_RECV,然後工作已經完成,我需要制動迴路。 現在我需要一些方法來通知從屬進程該作業已完成。有沒有辦法做到這一點?我認爲可能會有類似反向探測的內容來檢查是否有人等待消息,而不是檢查是否有消息要接收。沒有發現任何有用的壽。

編輯:一些更多的解釋。

我有一個root proc,它讀取一個巨大的文件並將讀取的數據發送給工作人員(其餘進程)。每個工作人員都會收到一部分數據,因此分佈得很好(每個工作人員的數據存儲量大致相同)。然後這些工作人員開始彼此通信,發送部分計算。當工作人員接受部分計算時,可能會產生大量新的部分結果,其中一些結果需要發送給其他工作人員。當所有的工人都無所事事,沒有更多的部分結果等待接收時,工作就完成了。

+0

工作完成後,根可以向所有人發送一個特殊的停止消息,如果他們完成,將發送完成的消息到根,並再次等待答覆,當根接收到所有完成後,它將發送一個最終完成所有使用這些都可以打破循環。 –

+0

問題是單個進程不知道它是否已完成。如果所有的從屬過程都沒有更多要發送的東西(即,它們全部掛在recv上),那麼工作就完成了。我有一個想法,但有一些發送之前和之後recv通知根進程正在等待消息(並且它收到了一些東西),如果所有進程都在等待,則發送停止消息給所有人。但是這種方法會產生大量來自根的信息,這似乎非常低效。 –

+0

Polawski 如果奴隸不知道它的完成,那麼它不能做任何事情來提醒根和其他人。對 ?所以剩下的唯一選擇是從服務器發送一些東西並檢查?但是讓我們說服務器何時發送檢查(或停止)它們可能沒有完成,因此停止會導致它們死亡而不完成工作? 所以我覺得我們都被封鎖了嗎? –

回答

0

你應該能夠避免出現預期接收但沒有發送的情況。發送處理器在主從式情況下應該始終跟蹤要發送多少工作。一般情況下,這種主從策略將與主設備保持一致,一旦總量達到跟蹤和查殺從設備...

就功能而言,最接近發送端的探測器可能是使用非 - 阻止發送MPI_isend,返回status,可以將其傳遞給MPI_test這樣的非阻塞類型,並且將返回MPI_SUCCESS,以便成功接收消息。如果您想阻止發送代碼,直到收到消息,您也可以使用MPI_Wait。使用測試/等待每個發送到每個進程的唯一標籤將成爲執行你想要的任務的一種方式。

+0

事情是我想知道,如果有些工作人員正在等待消息,而不是如果收到一條消息(我知道並用於釋放緩衝區),我需要檢查它在根進程中,除了讀取數據和收集結果。在原文中增加了更多解釋。 –