c ++ mpi派生的数据类型在不同的机器上

时间:2017-12-13 17:08:20

标签: c++ mpi cluster-computing

我想创建一个派生数据类型。特别是我想要一个这样的结构:

struct {
    int provider;
    double service;
    double cost;
} MPI_Struct;

根据网络手册,我应该写一些类似的东西:

  int blocks[3] = {1,1,1};
  MPI_Datatype types[3] ={MPI_INT,MPI_DOUBLE,MPI_DOUBLE};       
  MPI_Aint displacements[3];

  MPI_Datatype MPI_Struct;
  MPI_Aint doublex;

  MPI_Type_extent(MPI_DOUBLE,&doublex);

  displacements[0]=static_cast<MPI_Aint>(0);
  displacements[1]=doublex;
  displacements[2]=doublex+doublex;

  MPI_Type_struct(3,blocks,displacements,types,&MPI_Struct)

我的问题是使用MPI_Type_extent它应该与size_of()函数类似。由于我的程序将在具有MPI_Datatype_exent的不同计算机的群集上运行,因此我可以确定将My_Struct从一个进程传递到另一个进程的另一台进程中没有问题吗?

如果我没错,那些类型的位长不是标准的。

1 个答案:

答案 0 :(得分:1)

以下是我将如何写这个

typedef struct {
    int provider;
    double service;
    double cost;
} mystruct;

displacements[0]=static_cast<MPI_Aint>(offsetof(mystruct, provider));
displacements[1]=static_cast<MPI_Aint>(offsetof(mystruct, service));
displacements[2]=static_cast<MPI_Aint>(offsetof(mystruct, cost));
MPI_Type_struct(3,blocks,displacements,types,&tmp_ddt);
MPI_Type_create_resized(tmp_ddt, static_cast<MPI_Aint>(0), static_cast<MPI_Aint>(sizeof(mystruct)), &MPI_Struct);
MPI_Type_free(&tmp_ddt);

我很确定MPI_INTMPI_DOUBLE是比特长度的标准(fwiw,Fortran MPI_INTEGER数据类型不是),但编译器可能使用(或不使用)的填充不是。这就是为什么我宁愿使用offsetof()宏来填充displacements数组,然后调整数据类型的大小。