[英]MPI Send and Receive modes for large number of processors
我知道有很多關於 MPI 發送和接收的不同模式的問題和答案,但我相信我的不同,或者我根本無法將這些答案應用於我的問題。
無論如何,我的情況如下。 該代碼適用於具有潛在數千個內核的高性能集群,並被組織成一個多維網格。 在我的算法中,需要執行兩個連續的操作,我們稱它們為A和B ,其中A在B之前。 簡要說明如下:
A : 每個處理器都有多個緩沖區。 它必須將這些緩沖區中的每一個發送到一組特定的處理器。 對於要發送的每個緩沖區,接收處理器的集合可能不同。 發送是操作A的最后一步。
B :每個處理器從一組處理器接收一組緩沖區。 操作B將在收到所有緩沖區后處理這些緩沖區。 該操作的結果將存儲在固定位置(既不在發送緩沖區中,也不在接收緩沖區中)
還給出了以下屬性:
為了發送和接收, A和B都必須自己使用(嵌套)循環來發送和接收不同的緩沖區。 但是,我們不能對這些發送和接收語句的順序做出任何假設,即對於任何兩個緩沖區buf0
和buf1
,我們不能保證如果某個處理器在buf0
之前接收到buf1
,那么buf0
也在buf1
之前發送。 請注意,此時,由於確定接收/發送處理器集的復雜性,還不能選擇使用MPI_Broadcast
等組操作。
問題:我應該使用哪種發送和接收模式? 我已經閱讀了很多關於這些不同模式的不同內容,但我無法真正理解它們。 最重要的屬性是無死鎖,其次是性能。 我傾向於在A中使用 MPI_Isend( MPI_Isend()
而不檢查請求狀態,並在B的循環中再次使用非阻塞MPI_IRecv()
,然后使用MPI_Waitall()
確保接收到所有緩沖區(因此,也已發送所有緩沖區並且處理器已同步)。
這是正確的方法,還是我必須使用緩沖發送或完全不同的東西? 我在 MPI 方面沒有大量經驗,文檔也對我沒有太大幫助。
從您描述問題的方式來看,我認為MPI_Isend
可能是A的最佳(唯一?)選項,因為它保證非阻塞,而MPI_Send
可能是非阻塞的,但前提是它能夠在內部緩沖您的發送緩沖區.
然后,您應該能夠使用MPI_Barrier
以便所有進程同時進入B。 但這可能會影響性能。 如果你不堅持所有進程同時進入B ,一些進程可以更快地開始接收消息。 此外,鑒於您的發送和接收緩沖區不相交,這應該是安全的。
對於B ,您可以使用MPI_Irecv
或MPI_Recv
。 MPI_Irecv
可能更快,因為標准MPI_Recv
可能正在等待來自另一個進程的較慢發送。
無論您是否在接收端阻塞,您都應該在完成循環之前調用MPI_Waitall
以確保所有發送/接收操作都已成功完成。
另外一點:您可以利用MPI_ANY_SOURCE
和MPI_Recv
以阻塞方式接收消息並立即對它們進行操作,無論它們以什么順序到達。 但是,假設您指定在收到所有數據之前不對數據進行任何操作,這可能沒有那么有用。
最后:如這些建議中所述,如果您可以重組代碼以便只使用MPI_SSend
,您將獲得最佳性能。 在這種情況下,您將完全避免任何緩沖。 為此,您必須讓所有進程首先調用MPI_Irecv
,然后開始通過MPI_Ssend
發送。 以這種方式重構可能並不像您想象的那么難,特別是如果,正如您所說,每個進程都可以獨立地計算出它將從誰那里接收哪些消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.