MPI 查找位移的不同方法

MPI Different methods to find displacements

本文关键字:方法 查找 MPI      更新时间:2023-10-16

假设我有一个结构类型,如下所示:

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

我想发送它。我必须创建一个MPI_Type。我知道 4 种方法可以做到这一点。我在下面列出了它们。我想知道它们有什么区别、限制和好处。

  1. 使用MPI_Type_extent

  2. stddef.h中使用offsetof(),在这个答案中进行了解释: MPI 派生类型 发送答案

  3. 使用MPI_Get_address,也是同一答案中的一个例子。

  4. 使用reinterpret_cast<const unsigned char*>,我没有尝试,但这里有一个例子:MPI创建自定义数据

根据您链接的答案,选项 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()