MPI寻找位移的不同方法

7

Assume that i have a struct type as follows:

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

我想要发送它,需要创建一个MPI_Type。我知道4种方法来创建它们,以下是列出的方法。我想知道它们之间的区别、限制和好处。

  1. 使用MPI_Type_extent

  2. 使用stddef.h中的offsetof(),在这个答案中有解释:MPI Derived Type Send answer

  3. 使用MPI_Get_address,同样在同一个答案中有例子。

  4. 使用reinterpret_cast<const unsigned char*>,我没有尝试过,但这里有一个例子:MPI Create Custom Data

1个回答

3
选项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调用兼容。您可能需要编写一个类似于 offsetof()的函数或宏,其中内部使用MPI_Get_address()

虽然MPI标准中的指针与地址的观点是正确的,但同一类型的两个指针之间的差异被定义为这些指针所指向的该类型数组元素的下标之间的差异。此外,ISO C++规定指针的值是内存中对象存储开始的字节的地址(在转换时保留该地址,据我理解符合标准),尽管实际值表示可能是特定于实现的。因此,#4应该是相当可移植的。 - Hristo Iliev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接