MPI寻找位移的不同方法

时间:2014-04-01 08:40:49

标签: c++ 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

1 个答案:

答案 0 :(得分:2)

根据您链接的答案,选项1是错误的。

选项2是最直接的,并且具有作为常量表达式而不是函数调用的优点。

选项3和4可能在功能上相同,但3更安全。考虑:

  

给用户的建议。

     

C用户可能会试图避免使用MPI_GET_ADDRESS,并依赖于地址运算符&amp;的可用性。但请注意,   那&amp; cast-expression是一个指针,而不是一个地址。 ISO C没有   要求指针的值(或转换为int的指针)   指向的对象的绝对地址---虽然这是   通常情况下。此外,引用可能没有唯一性   具有分段地址空间的机器上的定义。指某东西的用途   MPI_GET_ADDRESS“引用”C变量保证了可移植性   这样的机器。 (结束对用户的建议。)

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

就个人而言,我会选择选项3,只是为了确保获得的值与其他MPI调用兼容。您可能希望启动与内部使用offsetof()的{​​{1}}类似的函数或宏。