2014-04-01 59 views
6

假設我有一個結構類型如下:MPI不同方法來尋找位移

typedef struct { 
float x, y, z; 
float velocity; 
int n, type; 
} Particle; 

我想送它。我必須創建一個MPI_Type。我知道4種方式來做到這一點。我將它們列在下面。我想知道它們有什麼區別,限制和好處。

  1. 使用MPI_Type_extent

  2. 使用offsetof()stddef.h,它在這個答案解釋:MPI Derived Type Send answer

  3. 使用MPI_Get_address,也是在同樣的答案的例子。

  4. 使用reinterpret_cast<const unsigned char*>,我沒有嘗試,但這裏有一個例子:MPI Create Custom Data

回答

2

選項1是錯了,因爲你每鏈接的答案。

選項2是最直接的,並且具有作爲常量表達式而不是函數調用的優點。

選項3和4可能功能相同,但3更安全。考慮:

給用戶的建議。

C用戶可能會想要避免使用MPI_GET_ADDRESS並依賴地址運算符&的可用性。但是請注意, 表示& cast-expression是一個指針,而不是一個地址。 ISO C不要求 要求一個指針的值(或指針強制轉換爲int)爲 指向的對象的絕對地址---儘管這通常是 的情況。此外,引用在具有分段地址空間的機器上可能沒有唯一的 定義。使用MPI_GET_ADDRESS來「引用」C變量保證了這種機器的可移植性。 (完建議用戶使用。)

來源:http://www.mpi-forum.org/docs/mpi-2.2/mpi22-report/node74.htm

就個人而言,我會用選項3去,只是爲了絕對確保所獲得的值將是兼容與其他MPI調用。您可能需要調用類似於內部使用MPI_Get_address()offsetof()的函數或宏。

+0

儘管MPI標準中的指針對於指針與地址有效,但是相同類型的兩個指針之間的差異被很好地定義爲兩個指針所指向的那種類型的數組的元素的下標之間的差異。另外,ISO C++指出,指針的值是內存中的字節地址,對象存儲開始於此處(儘管我理解標準,該地址在轉換上保留),但實際值表示可能是實現的-具體。因此#4應該相當便攜。 –