gpt4 book ai didi

c++ - MPI_DOUBLE_INT 和 C++ 结构

转载 作者:行者123 更新时间:2023-11-28 01:30:08 25 4
gpt4 key购买 nike

MPI standard定义了一系列数据类型 MPI_X_INT,其中 X = FLOAT, DOUBLE, ...。为了确定性,让我们坚持使用 MPI_DOUBLE_INT。它的正式定义是:

(p. 180) The datatype MPI_DOUBLE_INT is as if defined by the following sequence of instructions:

block[0] = 1;
block[1] = 1;
disp[0] = 0;
disp[1] = sizeof(double);
type[0] = MPI_DOUBLE;
type[1] = MPI_INT;
MPI_TYPE_CREATE_STRUCT(2, block, disp, type, MPI_DOUBLE_INT);

定义意味着 doubleint 之间没有填充。该标准还断言此类型的总大小应为 16,示例读取(对于 char 而不是 int):

(p.85) Example 4.1 Assume that Type = {(double, 0), (char, 8)} (a double at displacement zero, followed by a char at displacement eight). Assume, furthermore, that doubles have to be strictly aligned at addresses that are multiples of eight. Then, the extent of this datatype is 16 (9 rounded to the next multiple of 8).

对应的C++结构体是struct DI { double d;诠释我; };This answer断言 struct 应该被打包以避免 doubleint 之间的填充。但是打包结构的大小是 12(假设 sizeof(int) = 4),并且不可能使用它们的数组:

constexpr auto count = 2;  // >1
DI_packed di[count] = {...};
MPI_Send(di, count, MPI_DOUBLE_INT, ...); // wrong!

是否有一个 C++ struct 与 MPI 定义完全对应,并且可以在 MPI 代码中安全且可移植地使用?似乎使用 struct 的唯一保证方法是定义一个带有手动添加的尾部填充 char 的压缩结构。这是正确的吗?

附带说明一下,在我的机器上,MSVC 和 GCC 都会为解压的 struct DI 生成“MPI 兼容”布局,所以从实际的角度来看,这个问题可能无关紧要,但我我不确定。

最佳答案

也许您可以使用 union 来做到这一点?

如果你用g++编译下面的代码并运行

#include <iostream>
using namespace std;

int main()
{
typedef struct {double x; int i;} Tmp;
typedef union {char pad[16]; Tmp dint;} Doubleint;

Doubleint value;

value.dint.x = 3.14;
value.dint.i = 6;

cout << "sizeof(Tmp) = " << sizeof(Tmp) << endl;
cout << "sizeof(Doubleint) = " << sizeof(Doubleint) << endl;

typedef struct {double x; int i;} __attribute__((packed)) Packtmp;
typedef union {char pad[16]; Packtmp dint;} Packdoubleint;

Packdoubleint packvalue;

packvalue.dint.x = 6.12;
packvalue.dint.i = 9;

cout << "sizeof(Packtmp) = " << sizeof(Packtmp) << endl;
cout << "sizeof(Packdoubleint) = " << sizeof(Packdoubleint) << endl;

return 0;
}

你得到

sizeof(Tmp)       = 16
sizeof(Doubleint) = 16
sizeof(Packtmp) = 12
sizeof(Packdoubleint) = 16

即 union 变量(Doubleint 和 Packdoubleint)总是 16 字节长,即使结构有不同的大小——我已经强制使用特定于 g++ 的属性取消填充 Packtmp。

关于c++ - MPI_DOUBLE_INT 和 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51862937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com