2012-09-22 35 views
1

我想用MPI_Type_vector將矩陣的子域分散到每個進程。例如,矩陣是5x5,它被2x2子域分解。因此,子域的尺寸是:MPI_Type_vector在不同的進程中有不同的維度嗎?

_____________________ 
|   |   | 
| 0 | 1 | 
| (2,2) | (3,2) | 
|   |   | 
|_________|_________| 5 
|   |   | 
| 2 | 3 | 
| (2,3) | (3,3) | 
|   |   | 
|_________|_________| 

      5 

我就用自己的維度中的每個過程定義的MPI_Type_vector。我預計過程0和1中定義向量的大小是不同的。但他們的手柄是一樣的。它看起來像MPI只使用其中一個定義的向量。

謝謝!

PS:我已經通過手動包裝和拆裝的數據來實現這一功能,但我想用一些東西更方便。

回答

2

MPI_Datatype只是一個可以傳遞的句柄,它並不直接包含有關所做類型的任何信息。查看該句柄的值並不會告訴你該類型。我見過的大多數實現都使用int s,對於每個用戶定義的數據類型,遞增1。所以我不驚訝你的兩個向量數據類型句柄在不同內核上具有相同的值,如果它們是在該內核上聲明的第一個數據類型。

要回到關於域分解的主要問題,如果使用不同聲明的向量類型的核之間有任何通信,那麼將會失敗 - 發送核心和接收核心將需要處理相同的向量長度。因此,發送核心將需要使用與接收核心預期接收的數據量相對應的類型。

而在清潔域分解方面,我會推薦使用MPI_Cart函數(這裏有一個Web 1.0教程here)。

+0

感謝您提供有關「MPI_Cart」的信息。它將減輕笛卡爾拓撲的域分解處理。 –

2

MPI手柄當地到自己註冊到何處,只應視爲不透明類型的過程 - 你永遠也不會決定任何基於手柄的實際價值,你應該只比較手柄後面的對象使用MPI提供的比較功能(例如MPI_Comm_compare)。例如,在Open MPI中,MPI_Datatype是指向Fortran綁定的指針表中的C綁定和INTEGER索引的ompi_datatype_t結構的指針。

如果您的子域名是大小相等(例如,全是2x2),那麼nice hack與調整大小的MPI數據類型將允許您使用MPI_Scatterv/MPI_Gatherv以分散/集中他們。由於您的子域具有不同的大小,因此如果您希望使用單個集合MPI調用來分散/收集它們,那麼使用仔細提供的參數MPI_Alltoallw就是您需要的參數。您也可以使用它來實現收集操作。