2011-09-07 157 views
2

我想知道是否有可能同時接收來自一個發送者的消息,並以其他方式併發發送給一個接收者。如果是的話,它會如何表現?從一個發送者/接收者併發地接收/發送

爲了更明確的問題,讓我們想象一下,我們有4個線程,他們每一位都是從同一來源

MPI_Recv(buf, count, type, THE_SAME_SOURCE, tag, status) 

所有這些線程是同一MPI過程中監聽消息,所以他們所擁有的相同的MPI等級。並從其他MPI進程或相同但來自不同線程的人員,調用MPI_Send。每個接收者是否收到相同的消息,或者只是其中的一個,或者引發了一些異常(發生錯誤)?

換句話說,如果4個線程(在相同的MPI進程中或不在相同的MPI進程中)發送消息給可能也在相同的MPI進程中的一個接收器。它是否收到所有的消息?

我對MPI沒有太大的經驗,對上述問題的回答可能對我有很大的幫助。

謝謝

回答

3

接收按它們註冊的順序進行處理。從來沒有一個「同時」的情況,因爲它們是同步的。

Description of Point-To-Point Communication Semantics

所以,在你的第一個情況下,這意味着一個發送到那時四個線程正在等待接收將被髮送到第一線,以已登記領取,其他人將繼續等待後續消息。

在你的第二種情況下,再次沒有「在同一時間」。發送消息的第一個線程將是接收線程收到的線程。其他發送將不會有接收者註冊。

+0

這是一個很好的答案。鏈接爲+1。 –

+0

這與鏈接對多線程執行所說的內容是否相反?它指出:「[...]同樣,如果兩個邏輯併發的接收操作接收到兩個連續發送的消息,則這兩個消息可以按任意順序匹配兩個接收。」我讀它的方式我們無法知道哪個線索的收到將「贏」。我錯了嗎?編輯:另外我的報價確實說,兩個接收操作確實可以是邏輯併發的(即「同時」)。 – Quantumboredom

+1

@Quantumboredom:我可以看到這個鏈接如何表達可能會讓人困惑。引用和周圍的段落指出,當你有兩個沒有任何外部順序點的線程時,那麼你沒有任何定義的發送和接收的順序。有時你運行,一個會擊敗另一個,並且其他時間可能是另一種方式。我的觀點是他們實際上是在幕後同步的,所以他們絕不會「同時」發生。換句話說,我的觀點是總是會有第一個,行爲是由這個順序定義的。 – ex0du5