我想创建一个派生数据类型。特别是我想要一个这样的结构:
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
从一个进程传递到另一个进程的另一台进程中没有问题吗?
如果我没错,那些类型的位长不是标准的。
答案 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_INT
和MPI_DOUBLE
是比特长度的标准(fwiw,Fortran MPI_INTEGER
数据类型不是),但编译器可能使用(或不使用)的填充不是。这就是为什么我宁愿使用offsetof()
宏来填充displacements
数组,然后调整数据类型的大小。