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_INT
和 MPI_DOUBLE
的位长度是标准的(fwiw,Fortran MPI_INTEGER
数据类型不是),但编译器可能使用(或不使用)的填充不是。这就是为什么我宁愿使用offsetof()
宏来填充displacements
数组,然后调整数据类型的大小。
【讨论】:
谢谢! MPI_create_resized 到底是做什么的?我是 mpi 的新手,尤其是派生类型。MPI_Type_create_resized()
基本上是设置范围。如果你MPI_Send()
两个元素,第一个从偏移量0
开始,第二个从偏移量extent
开始。不能保证 MPI 和编译器会在结构的末尾处理填充(如果有的话),所以明确告诉 MPI 编译器选择了什么会更安全。以上是关于c ++ mpi在不同机器上派生数据类型的主要内容,如果未能解决你的问题,请参考以下文章
MPI 派生数据类型适用于浮点数,但不适用于双精度数。是对齐问题吗?