2011-04-19 50 views
3

我有一個並行編程類的並行I/O項目,我必須實現派生數據類型。我沒有清楚地理解darray和子陣列之間的區別。 darray可以從動態分配的數組中派生嗎?主要區別是什麼?darray和mpi中的子數組有什麼區別?

回答

5

子數組允許您描述更大的多維數組的單個塊/切片。如果每個MPI任務都有一個大型全局數組的單個片/塊(或者如果您正在任務之間傳遞本地數組的塊),那麼MPI_Type_create_subarray是要走的路;語法非常簡單。爲了解決像常規網格上的PDE這樣的事情,這種分佈非常普遍 - 每個處理器都有自己的全局網格塊,儘可能多的網格單元是本地的。在MPI-IO的情況下,每個MPI任務都會創建一個與其全局數組相對應的子數組,並使用它作爲視圖將其部分域讀入/寫出到包含所有數據的文件中。

MPI_Type_create_darray允許比單個塊更復雜的分佈式陣列模式。對於分佈式線性代數計算,分佈某些矩陣可能是有意義的 - 比方說,如果有5 mpi的任務,任務0獲得第0,5,10行...和任務1獲得第1,6,6,8行, 11,等等。其他矩陣可能按列分佈;或者您可以將它們分佈在行,列或兩者的塊中。這些數據分佈與命運不佳的HPF中的數據分佈相同,因此您可以通過這種方式逐個數組地定義數組的數據並行佈局。

我自己曾經使用MPI_Type_create_darray的唯一方法,也是我見過它的唯一方法,就是創建一個大矩陣的MPI文件視圖,以便以block-cyclic的形式分配數據,這樣可以讀取該文件,然後使用scalapack在分佈式矩陣上執行並行線性代數運算。

+0

很好的解釋!謝謝! – onatm 2012-04-01 19:45:31