2013-09-27 46 views
4

MPI基本數據類型對應於主機語言的數據類型,MPI_BYTE和MPI_PACKED除外。我的問題是使用這些MPI基本數據類型的好處是什麼?或者等價地說,爲什麼只使用宿主語言數據類型就不好?MPI數據類型的好處是什麼?

我讀威廉Gropp等一個教程在滑塊31「爲什麼數據類型」,它說:

  • 由於所有數據都通過類型標記時,MPI實現可以支持進程之間的通信的機器上非常不同的存儲器表示和基本數據類型的長度(異構通信)。在存儲器中的數據的
  • 指定面向應用的佈局
    • 減少在執行
    • 允許使用特殊的硬件的存儲器到存儲器的副本(分散/聚集)可用

http://www.mcs.anl.gov/research/projects/mpi/tutorial/mpiintro/ppframe.htm

我不明白這個解釋。首先,如果基本數據類型不同,我不明白爲什麼使用MPI數據類型可以解決差異,因爲基本MPI數據類型對應於主機語言(基本數據類型)的基本數據類型。其次,爲什麼這種面向應用的內存數據佈局具有上述兩個好處?

任何解決我原來問題的答案都將被接受。任何答案都可以解決我的問題,William Gropp的解釋也將被接受。

回答

2

簡短的回答是,這個系統爲MPI增加了一個強類型級別。

長的答案是,MPI數據類型的目的是告訴MPI函數他們正在處理什麼。因此,例如,如果您從小端機器發送int到大端機器,那麼MPI可以爲您執行字節順序轉換。另一個更常見的好處是MPI知道MPI_DOUBLE有多大,所以你不必在任何地方都有大量的sizeof聲明。

請注意,MPI數據類型是標記,而不是實際的數據類型。換句話說,你用

double d; 

MPI_DOUBLE d; 
+0

我不明白最後一個例子。假設'd'是可變的,將從一個進程發送到另一個進程。當我們定義'd'時,我們當然使用'MPI_DOUBLE d',而不是'double d',對吧? – user2196452

+0

在程序中使用'double d'。看看MPI_Send的原型。注意它需要一個'void *'作爲緩衝區來發送。它還要求MPI_Datatype告訴它緩衝區中的內容。這就是你放MPI_DOUBLE的地方。 – Adam

+0

我明白你的意思了。換句話說,我們可以在程序中使用'double d;'或'MPI_DOUBLE d;'(如果編譯器不抱怨)。你對這兩個好處有什麼看法,即減少mem-to-mem副本並允許使用特殊硬件? – user2196452

2

首先,如果基本數據類型是不同的,我不明白爲什麼使用 MPI數據類型可以解決由於基本數據類型MPI的區別 對應於主機語言(基本數據類型)的基本數據類型。

由於給定的MPI數據類型不需要在兩個不同的機器上引用相同的基本類型。 MPI_INT可能是一臺機器上的int,另一臺機器上可能是long。這在C++中特別有用,因爲the C++ standard doesn't specify byte size for the various integral types,因此int實際上可能在一臺機器上比另一臺機器上具有更多位。

二,爲什麼這種面向應用的數據在內存中的佈局具有 提到的兩個好處?

看看MPI_Send()的參數。它會收到數據開始的void*以及要發送的元素數量。它假定元素在內存中連續排列,一個接一個,並且都是相同的類型。除了最幸運的情況外,在你的應用中這不會是真的。即使你只是有一個簡單的結構數組(結構的元素不是全部相同的類型),發送這些沒有用戶定義的MPI數據類型的結構的唯一方法是將每個結構的第一個元素複製到單獨的數組,發送它,然後將每個結構中的第二個元素複製到不同的數組中,發送它,等等。派生的MPI數據類型允許您直接從它所在的位置獲取數據,而無需重新排列或複製它。

雖然我不確定第二點應該指的是什麼。