我正在嘗試進行全無止境的溝通。基本上我有多個相同大小的浮點數組,由整數ID標識。我可以捆綁兩條MPI消息嗎?
應該是每一個消息,如:
<int id><float array data>
在接收端,它知道很多陣列究竟如何在那裏,從而建立RECVS的確切人數。收到消息後,它會解析該ID並將數據放入正確的位置。問題是可以從任何其他進程向接收進程發送消息。 (例如,生產者具有工作隊列結構,並且處理隊列中可用的任何ID)
由於MPI僅保證P2P在訂單遞送中,我不能在兩個消息中平分地放置整數ID和FP數據,否則接收器可能無法將id與數據匹配。 MPI不允許一次發送兩種類型的數據。
我只能想到兩種方法。
1)Receiver有一個大小爲m(source [m])的數組,m是發送節點的數量。發件人先發送id,然後發送數據。接收者在收到來自發件人i的整數消息後將id保存到源[i]。在收到來自發件人i的FP數組後,它會檢查source [i],獲取id並將數據移動到正確的位置。它的工作原理是MPI保證有序的P2P通信。它要求接收者保存每個發送者的狀態信息。更糟糕的是,如果一個發送進程可以在數據之前發送兩個id(例如多線程),則此機制將不起作用。
2)將id和FP視爲字節,並將它們複製到發送緩衝區中。將它們作爲MPI_CHAR發送,然後接收器將它們轉換回整數和FP數組。然後我需要支付複製東西到發送方的字節緩衝區的附加成本。隨着我在MPI進程中增加線程數量,總臨時緩衝區也會增長。
它們都不是完美的解決方案。我不想在進程中鎖定任何內容。我想知道你們有沒有更好的建議。
編輯:代碼將在包含infiniband的共享羣集上運行。機器將被隨機分配。所以我不認爲TCP套接字可以幫助我。另外,IPoIB看起來很貴。我確實需要完整的40Gbps速度進行通信,並讓CPU進行計算。
我同意使用MPI_ANY_SOURCE和標籤「應該」工作,但它不符合我的代碼中指定的行爲。這次我會嘗試自己的數據類型。謝謝! – wujj123456
你提出的建議是非常不可移植的,並且不適用於異構環境。一種便攜式的解決方案是使用兩個字段來註冊一個MPI結構類型,MPI_INT類型和塊長度爲1,MPI_FLOAT類型和塊長度爲asize。 –
@HristoIliev你是對的。現在問題應該得到解決。 – Massimiliano