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

Posted

技术标签:

【中文标题】c ++ mpi在不同机器上派生数据类型【英文标题】:c++ mpi derived datatypes on different machines 【发布时间】:2018-05-27 16:15:06 【问题描述】:

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

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 从一个进程传递到另一台机器上的另一个进程没有问题吗?

如果我没记错的话,类型的位长不是标准的..

【问题讨论】:

你的机器有什么不同? 目前我不知道确切的区别。它们是大学计算机,我还没有使用它们。 一切都应该是绝对同质的。不要在混合不同的操作系统/安装/版本/MPI 实现/编译器选项/二进制文件/CPU 上运行 MPI,除非您真的知道自己在做什么。 你是对的。谢谢! 【参考方案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 数组,然后调整数据类型的大小。

【讨论】:

谢谢! MPI_create_resized 到底是做什么的?我是 mpi 的新手,尤其是派生类型。 MPI_Type_create_resized() 基本上是设置范围。如果你MPI_Send() 两个元素,第一个从偏移量0 开始,第二个从偏移量extent 开始。不能保证 MPI 和编译器会在结构的末尾处理填充(如果有的话),所以明确告诉 MPI 编译器选择了什么会更安全。

以上是关于c ++ mpi在不同机器上派生数据类型的主要内容,如果未能解决你的问题,请参考以下文章

MPI 派生数据类型适用于浮点数,但不适用于双精度数。是对齐问题吗?

使用 MPI 派生数据类型创建和通信“结构数组”

结构填充和非阻塞通信缓冲区问题导致的 MPI 派生数据类型问题

具有动态分配成员的动态分配结构的 MPI 派生数据类型

与不同大小数据类型的 MPI 通信

C 中数字数据类型在不同机器上所占字节数