我正在使用MPI(Fortran,但問題比MPI標準更特定於任何給定語言),特別是使用緩衝發送/接收函數isend和irecv。現在,如果我們想象以下場景:MPI緩衝發送/接收指令
進程0:
isend(stuff1, ...)
isend(stuff2, ...)
流程1:
wait 10 seconds
irecv(in1, ...)
irecv(in2, ...)
交付在他們被送了以處理1的信息,即我可以確定in1 == stuff1和in2 == stuff2 如果使用的標籤在所有情況下都是相同的?
必須-1,因爲我不能相信你的「是」和「否」答案中的「否」部分......用你在那裏建議的方式「檢查完成」是很荒唐的。等價地,如果我問你「是否是x = 42; printf(」%d「,x);'保證打印42?你可以說「是,否,否則,因爲如果你是通過調試器進行單步調試,並改變了'x'的值,那麼它就不會。」 – 2010-03-28 06:41:22
@j ...描述的情況發生在我支持的三個不同的用戶身上。他們的工作具有多線程級別,只有一個MPI通信線程。其他線程正在與硬件控制器交互。硬件控制器線程正在檢查緩衝區的最後一位以確定消息完成。當他們從TCP移動到IB時,顯示了無序的消息到達問題。這更像是一個「編譯器優化」,而不是你給出的調試器例子。結構管理器保存緩衝區順序,但優化了實際的傳輸順序。 – 2010-03-29 15:47:55
好吧,我驚呆了。 (這就是MPI_Test()用於*!)但是,如果3個用戶得到了這個錯誤,那麼你的帖子中的信息是有價值的,所以如果你編輯它來添加一個大聲的「但不要做這個,它是愚蠢的」或有些,我會+1。 – 2010-04-02 10:49:58