2014-07-02 82 views
1

最近我正在致力於實現並行LBM方法。我發現在執行流媒體部分之前實施MPI_index時,甚至可能會導致額外的通信開銷。例如,當我嘗試使用MPI_type_index定義新的MPI_type時,它從任意分佈的域中複製某個部分或者塊號碼相對較小,這可能會導致額外的開銷。MPI_type_index可能會增加通信開銷

因此,如果我理解正確,我會問經驗豐富的並行編程程序員嗎?

回答

3

您的問題的答案和往常一樣:它取決於。這取決於網絡系統是否支持聚集讀取(用於傳出消息)和分散寫入(用於傳入消息),以及是否啓用異構支持。

當數據在內存中不連續並且網絡不支持從主存儲器收集讀取數據時,數據必須在發送之前打包,因此必須進行額外的複製。當網絡不支持分散寫入主存儲器時,這同樣適用於將數據解包到非連續區域。

如果啓用了異構支持,則必須將所有基本數據項都轉換爲與機器無關的中間表示。轉換後的數據進入一箇中間緩衝區,稍後通過網絡發送。

詳述Jonathan Dursi的評論。 MPI數據類型本身不會產生網絡通信開銷。這是在通信操作之後發生的開銷導致的數據打包和解包。 MPI數據類型基本上是用於在構建或解構消息時如何從內存讀取或寫入數據的配方。通過適當的網絡硬件,可以理解聚集讀取和分散寫入 MPI實現,該MPI實現可以對該硬件進行適當編程,可以將MPI數據類型內的指令翻譯爲一組讀取或寫入矢量,然後使網絡適配器做重包裝和拆包。如果網絡不支持這種操作,或者MPI實現不知道如何將該操作卸載到硬件上,則打包必須在軟件中發生,並且通常包含中間緩衝區。這是開銷來自的地方。正如Jonathan Dursi已經指出的那樣,MPI中的數據類型打包器/解包器例程經過了極其優化,他們通常儘可能高效地完成工作(只需查看Open MPI源代碼即可瞭解它們進入調優的最佳程度緩存利用率)。因此,如果您的算法需要索引數據類型或任何其他類型的數據類型與數據項之間的空洞,只需構建適當的MPI數據類型並使用它。

支持這些操作的示例網絡互連是InfiniBand。每個發送或操作請求都提供了所謂的分散/聚集元素(SGE)列表。我沒有深入探討不同的MPI實現,也不知道他們是否能夠利用SGE來跳過軟件打包階段。儘管大量的分散數據項可能無法很好地工作。

另請注意,對於數據元素之間以及此類數據類型的數組之間填充零的連續數據類型,不需要打包或解包。在這種情況下,整個內存塊將按原樣發送到另一個進程(除非系統是異構的)。

+1

另外,值得注意的是@Lbj_x並不是MPI_Type_indexed(或其他)會增加開銷;這是內存佈局。收集分散在幾頁上的10個雙打(比方說)要比連續存儲10個雙打(可能)更昂貴。但是,如果這是你必須發送的數據,那就是這樣,而且無論如何你將不得不支付這筆費用。 MPI數據類型至少可以像你自己編寫的任何東西一樣完成這項工作。 –