2012-09-30 67 views
1

我在各個地方都問過這個問題,包括OpenMPI郵件列表。到目前爲止,我沒有運氣。所以,如果有人能夠提供幫助,我會很感激,無論這個問題看起來多麼愚蠢。OpenMPI:使用標記:可以使用它們來創建虛擬通道嗎?

問題:

考慮兩個進程A和B上的兩個不同的處理器上運行。沒有其他 進程運行。進程A有兩個要發送的消息,M1(大小:大,標記T1)和M2(1字節,標記T2)。過程B使用MPI_Probe來選擇性地過濾和接收消息。當它沒有MPI_Recv消息M1時,是否保證進程B仍然可以接收消息M2, ?考慮過程A首先發送M1。 所有進程都是單線程的。

此外,OpenMPI確保可以以任何順序接收來自同一源 的具有相同標記的兩個不同消息嗎?

基本上,我想了解OpenMPI的系統緩衝區是否會發揮任何作用:如果有一條消息設法填滿它,則可能永遠不會收到來自同一源的另一個消息,但帶有另一個標記。正確?

非常感謝任何想法。

德文德拉

回答

2

我給你回的開放MPI的用戶列表中,同時也將它張貼在這裏,萬一有人覺得它有用。我相信Jeff Squyres已經在Open MPI郵件列表上回答了您的問題,或者至少暗示了可能存在的問題。 MPI消息按它們發送的順序接收,但只在特定的(標記,通信器)元組內。這基本上意味着:

  • 在同一個通訊器中,如果它們攜帶不同的標籤,您可以接收不按順序的消息;
  • 攜帶相同標籤的消息如果在不同的上下文(通信器)中進行通信,可能會被無序接收。

但是,這裏有一個問題:如果發送操作尚未發佈,您將無法收到消息。如果你有兩個連續的發送操作,你必須確保第一個不會永遠阻塞。標準的MPI發送操作MPI_Send可以以各種方式實現(標準沒有詳細說明如何),但是在大多數MPI實現中,它的行爲類似緩衝發送非常小的消息,並且像大型消息的同步發送。如果你在你發送過程中的以下兩個調用:

MPI_Send(largedata, largecount, MPI_INT, dest, tag1, MPI_COMM_WORLD); 
MPI_Send(smalldata, smallcount, MPI_INT, dest, tag2, MPI_COMM_WORLD); 

是可能發生的第一MPI_Send實際上表現爲一個同步,也就是說,它不會返回,除非匹配的接收操作被張貼在接收方。假設你的接收器的代碼是:

MPI_Probe(src, tag2, MPI_COMM_WORLD, &status); 
MPI_Recv(largedata, largecount, MPI_INT, src, tag1, MPI_COMM_WORLD, &status); 

這很可能會陷入僵局,因爲MPI_Probe是一個阻塞調用,也就是說,它不會返回,直到匹配發送被張貼,即第二MPI_Send就必須執行,這不僅會在第一次發送返回後發生,但除非接收器中的MPI_Recv正在執行,否則不會發生。我猜你的想法

爲了防止你可以修改發送方的代碼僵局使用非阻塞發送:

MPI_Request req; 
MPI_Isend(largedata, largecount, MPI_INT, dest, tag1, MPI_COMM_WORLD, &req); 
MPI_Send(smalldata, smallcount, MPI_INT, dest, tag2, MPI_COMM_WORLD); 
MPI_Wait(&req, MPI_STATUS_IGNORE); 

立即發送調用返回使用非阻塞操作和操作繼續背景,所以第二次發送會在那之後立即執行。現在會有兩個待處理的消息,並且它們可以以任何順序接收,因爲它們攜帶不同的標籤。

+0

非常感謝Iliev!我錯過了傑夫的回答,這太簡潔了。這更有幫助! –

+0

不客氣。令人遺憾的是,官方和長期運行的郵件列表被Web 2.0技術所掩蓋,但這似乎是未來... –

相關問題