假设我有一个结构类型如下:
typedef struct {
float x, y, z;
float velocity;
int n, type;
} Particle;
我想发送它。我必须创建一个MPI_Type。我知道有4种方法可以做到。我在下面列出了它们。我想知道它们的区别,限制和好处是什么。
使用MPI_Type_extent
在offsetof()
中使用stddef.h
,在此答案中对此进行了解释:MPI Derived Type Send answer
使用MPI_Get_address
,也是同一答案中的一个示例。
使用reinterpret_cast<const unsigned char*>
,我没有尝试,但这里有一个例子:MPI Create Custom Data
答案 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}}类似的函数或宏。