2010-01-07 86 views
3

我正在使用MPI(Fortran,但問題比MPI標準更特定於任何給定語言),特別是使用緩衝發送/接收函數isend和irecv。現在,如果我們想象以下場景:MPI緩衝發送/接收指令

進程0:

isend(stuff1, ...) 
isend(stuff2, ...) 

流程1:

wait 10 seconds 
irecv(in1, ...) 
irecv(in2, ...) 

交付在他們被送了以處理1的信息,即我可以確定in1 == stuff1和in2 == stuff2 如果使用的標籤在所有情況下都是相同的

回答

6

是的,這些消息按照它們發送的順序接收。這被標準描述爲非超車信息。看到這個MPI Standard section瞭解詳情,以下是摘錄:

訂單消息是不超車:如果發件人發送兩個消息相繼到同一目的地,並且都匹配相同的接收,則該操作無法接收第二條消息,如果第一條消息仍然未決。如果接收者連續發送兩個接收者,並且兩者都匹配相同的消息,則如果第一個接收操作仍然未決,則第二個接收操作不能被該消息滿足。這個要求有利於發送到接收方的匹配。它保證消息傳遞代碼是確定性的,如果進程是單線程的,並且通配符MPI_ANY_SOURCE未用於接收。 (稍後描述的一些呼叫,例如MPI_CANCEL或MPI_WAITANY,是非確定性的附加來源。)

2

是和否。

我可以肯定的是IN1 == stuff1和 平方英寸== stuff2如果所使用的標籤是 在所有情況下一樣的嗎?

是的。 send和recv之間有一個確定的1:1相關性,它將正確的輸入到正確的recv緩衝區中。此行爲由標準保證,並由所有MPI實施強制執行。

號內部消息進展,並且其中在接收器側被填充緩衝器的確切順序的確切次序是有點的黑箱....尤其與多個RDMA式消息傳輸在飛行緩衝器正在時使用(例如InfiniBand)。

如果您的代碼使用多個線程並檢查緩衝區以確定完整性(例如等待某個位切換)而不是使用MPI_Test或MPI_Wait,則可能消息可能無序到達(但在正確的緩衝區中)。

如果您的代碼依賴於正在填充的in1 = stuff1 BEFORE in2 = stuff2填充在接收端,並且這兩個消息都有一個發送級別,則使用MPI_Issend(非阻塞,同步發送)將會保證郵件按順序收發。如果需要保證來自多個發送隊列的多個recv的緩衝區填充順序,則每個revc之間需要某種阻塞調用(例如,MPI_Recv,MPI_Barrier,MPI_Wait等)。

+0

必須-1,因爲我不能相信你的「是」和「否」答案中的「否」部分......用你在那裏建議的方式「檢查完成」是很荒唐的。等價地,如果我問你「是否是x = 42; printf(」%d「,x);'保證打印42?你可以說「是,否,否則,因爲如果你是通過調試器進行單步調試,並改變了'x'的值,那麼它就不會。」 – 2010-03-28 06:41:22

+2

@j ...描述的情況發生在我支持的三個不同的用戶身上。他們的工作具有多線程級別,只有一個MPI通信線程。其他線程正在與硬件控制器交互。硬件控制器線程正在檢查緩衝區的最後一位以確定消息完成。當他們從TCP移動到IB時,顯示了無序的消息到達問題。這更像是一個「編譯器優化」,而不是你給出的調試器例子。結構管理器保存緩衝區順序,但優化了實際的傳輸順序。 – 2010-03-29 15:47:55

+0

好吧,我驚呆了。 (這就是MPI_Test()用於*!)但是,如果3個用戶得到了這個錯誤,那麼你的帖子中的信息是有價值的,所以如果你編輯它來添加一個大聲的「但不要做這個,它是愚蠢的」或有些,我會+1。 – 2010-04-02 10:49:58