【发布时间】:2017-11-14 00:28:44
【问题描述】:
我正在为 mpi 编写一个 type_traits 库,但是当我将 float int 定义为 MPI_FLOAT_INT 的类型时,我在声明错误中得到两个或多个变量类型,c++ 中 MPI_FLOAT_INT 的等效类型是什么?
【问题讨论】:
我正在为 mpi 编写一个 type_traits 库,但是当我将 float int 定义为 MPI_FLOAT_INT 的类型时,我在声明错误中得到两个或多个变量类型,c++ 中 MPI_FLOAT_INT 的等效类型是什么?
【问题讨论】:
唯一的权威来源MPI standard 将MPI_FLOAT_INT 定义为(第5.9.4 节MINLOC 和MAXLOC):
数据类型
MPI_FLOAT_INT好像由以下指令序列定义。
type[0] = MPI_FLOAT
type[1] = MPI_INT
disp[0] = 0
disp[1] = sizeof(float)
block[0] = 1
block[1] = 1
MPI_TYPE_CREATE_STRUCT(2, block, disp, type, MPI_FLOAT_INT)
类似的陈述适用于
MPI_LONG_INT和MPI_DOUBLE_INT。
表示类型对应struct { float a; int b; },但前提是保证a和b之间不插入填充空间。在int 是 64 位且必须在 8 个字节上对齐的系统上,情况可能并非如此。可能需要指示编译器生成打包结构,例如使用 GCC:
#pragma pack(push, 1)
struct float_int
{
float a;
int b;
}
#pragma pack(pop)
请注意,MPI_FLOAT_INT 旨在用于 MINLOC 和 MAXLOC 减少,以便找出最小/最大 float 值和持有它的最低编号等级。
【讨论】:
MPI_FLOAT_INT
这是一对 32 位浮点数,后跟一个 32 位整数。
等价物是std::pair<float, int> 或struct float_int{ float f; int i;};。
您可以尝试使用int32_t 而不是int 和static_assert(sizeof(float) == 4); 做得更好,以尝试正确设置大小。
【讨论】:
根据Linux man page,MPI_FLOAT_INT是一个结构体,定义为:
struct { float, int }
【讨论】: