有沒有辦法檢查一些進程是否正在等待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,它讀取一個巨大的文件並將讀取的數據發送給工作人員(其餘進程)。每個工作人員都會收到一部分數據,因此分佈得很好(每個工作人員的數據存儲量大致相同)。然後這些工作人員開始彼此通信,發送部分計算。當工作人員接受部分計算時,可能會產生大量新的部分結果,其中一些結果需要發送給其他工作人員。當所有的工人都無所事事,沒有更多的部分結果等待接收時,工作就完成了。
工作完成後,根可以向所有人發送一個特殊的停止消息,如果他們完成,將發送完成的消息到根,並再次等待答覆,當根接收到所有完成後,它將發送一個最終完成所有使用這些都可以打破循環。 –
問題是單個進程不知道它是否已完成。如果所有的從屬過程都沒有更多要發送的東西(即,它們全部掛在recv上),那麼工作就完成了。我有一個想法,但有一些發送之前和之後recv通知根進程正在等待消息(並且它收到了一些東西),如果所有進程都在等待,則發送停止消息給所有人。但是這種方法會產生大量來自根的信息,這似乎非常低效。 –
Polawski 如果奴隸不知道它的完成,那麼它不能做任何事情來提醒根和其他人。對 ?所以剩下的唯一選擇是從服務器發送一些東西並檢查?但是讓我們說服務器何時發送檢查(或停止)它們可能沒有完成,因此停止會導致它們死亡而不完成工作? 所以我覺得我們都被封鎖了嗎? –