2016-09-01 47 views
1

在我處理的具體問題中,排列在3D拓撲中的過程必須相互交換3D陣列的部分。特別是,每個人都必須發送給定數量的切片A到六個方向的過程(例如A(nx-1:nx,:,:)到正一維的過程,負一個的A(1:3,:,:),正的y維的A(:,ny-3:ny,:),以及等等)。 爲了做到這一點,我要定義一組子類型(通過MPI_TYPE_CREATE_SUBARRAY)用於通訊(可能是MPI_NEIGHBOR_ALLTOALLVW擴展名)。現在的問題是什麼更好的選擇,在性能方面,之間:MPI - 溝通一個大型或更多小型元素的一個元素?

  • 定義3子陣列(每個維度),每一個實際上是一個二維數組,然後進行通信沿着每個維度發送在這兩個方向上有不同數量的這些類型,或者
  • 定義了6個子數組(每個方向一個),每個數組仍然是一個3D數組,然後使通信沿着每個維度發送這兩種類型中的一個元素兩個方向?

最後,更一般地,如在標題,是它更好地定義更多的「基本的」 MPI導出的數據類型和在通信使用counts大於1,或以限定「更大」的類型和與在通信中使用counts = 1

回答

2

MPI派生數據類型的定義是爲庫提供打包和解包您發送的數據的方法。

對於基本類型(MPI_INT,MPI_DOUBLE等),沒有問題,因爲內存中的數據已經是連續的:內存中沒有空洞。

更復雜的類型,如多維數組或結構,發送數據(如)可能效率低下,因爲您可能正在發送無用的數據。由於這個原因,數據被打包成連續的字節數組,發送到目的地,然後再次解壓縮以恢復其原始形狀。

也就是說,您需要爲內存中的每個不同形狀創建派生數據類型。例如,A(1:3,:,:)A(nx-2:nx,:,:)表示相同的數據類型。但是A(nx-2:nx,:,:)A(:,nx-2:nx,:)沒有。如果您正確指定了跨度訪問(連續數據類型之間的差距),您甚至可以指定一個2D派生數據類型,然後更改count參數以獲得更好的程序靈活性。

最後,爲了回答你最後的問題,這可能是值得基準的,但我認爲差異不會很明顯,因爲它在兩種情況下都會產生單個MPI消息。

相關問題