【问题标题】:what is the c++ equivalent type if MPI_FLOAT_INT如果 MPI_FLOAT_INT 是什么 c++ 等效类型
【发布时间】:2017-11-14 00:28:44
【问题描述】:

我正在为 mpi 编写一个 type_traits 库,但是当我将 float int 定义为 MPI_FLOAT_INT 的类型时,我在声明错误中得到两个或多个变量类型,c++ 中 MPI_FLOAT_INT 的等效类型是什么?

【问题讨论】:

    标签: c++ mpi


    【解决方案1】:

    唯一的权威来源MPI standardMPI_FLOAT_INT 定义为(第5.9.4 节MINLOCMAXLOC):

    数据类型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_INTMPI_DOUBLE_INT

    表示类型对应struct { float a; int b; },但前提是保证ab之间不插入填充空间。在int 是 64 位且必须在 8 个字节上对齐的系统上,情况可能并非如此。可能需要指示编译器生成打包结构,例如使用 GCC:

    #pragma pack(push, 1)
    struct float_int
    {
       float a;
       int b;
    }
    #pragma pack(pop)
    

    请注意,MPI_FLOAT_INT 旨在用于 MINLOCMAXLOC 减少,以便找出最小/最大 float 值和持有它的最低编号等级。

    【讨论】:

      【解决方案2】:

      根据documentation

      MPI_FLOAT_INT
      这是一对 32 位浮点数,后跟一个 32 位整数。

      等价物是std::pair<float, int>struct float_int{ float f; int i;};

      您可以尝试使用int32_t 而不是intstatic_assert(sizeof(float) == 4); 做得更好,以尝试正确设置大小。

      【讨论】:

      • 这不是官方的 MPI 规范。 MPI 不规定 int 或 float 中的字节数。
      【解决方案3】:

      根据Linux man pageMPI_FLOAT_INT是一个结构体,定义为:

      struct { float, int }

      【讨论】:

        猜你喜欢
        • 2012-12-21
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 2016-03-21
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多