在我處理的具體問題中,排列在3D拓撲中的過程必須相互交換3D陣列的部分。特別是,每個人都必須發送給定數量的切片A
到六個方向的過程(例如A(nx-1:nx,:,:)
到正一維的過程,負一個的A(1:3,:,:)
,正的y維的A(:,ny-3:ny,:)
,以及等等)。 爲了做到這一點,我要定義一組子類型(通過MPI_TYPE_CREATE_SUBARRAY
)用於通訊(可能是MPI_NEIGHBOR_ALLTOALL
或V
或W
擴展名)。現在的問題是什麼更好的選擇,在性能方面,之間:MPI - 溝通一個大型或更多小型元素的一個元素?
- 定義3子陣列(每個維度),每一個實際上是一個二維數組,然後進行通信沿着每個維度發送在這兩個方向上有不同數量的這些類型,或者
- 定義了6個子數組(每個方向一個),每個數組仍然是一個3D數組,然後使通信沿着每個維度發送這兩種類型中的一個元素兩個方向?
最後,更一般地,如在標題,是它更好地定義更多的「基本的」 MPI導出的數據類型和在通信使用counts
大於1,或以限定「更大」的類型和與在通信中使用counts = 1
?