我有一个类型的结构:
typedef struct{
double x;
double y;
double z;
}bodyType;
我想使用allgatherv只交换结构的x和y成员。这可能是使用MPI_Type_vector还是不适用于结构?
我尝试了以下内容:
MPI_Datatype MPI_Position_type;
MPI_Datatype pos_types= {MPI_DOUBLE,MPI_DOUBLE};
int blocklen[2] = {1,1};
MPI_Aint dis[2];
size_t offset_x_1 = offsetof(bodyType,x);
size_t offset_y_1 = offsetof(bodyType,y);
dis[0] = offset_x_1;
dis[1] = offset_y_1;
MPI_Type_create_struct(2,blocklen,dis,&pos_types,&MPI_Position_type);
MPI_Type_commit(&MPI_Position_type);
...
MPI_Allgatherv(MPI_IN_PLACE,0,MPI_Position_type,bodies,counts,displacements,MPI_Position_type,MPI_COMM_WORLD);
但是我得到了一个SEGFAULT。
实际上,在这种情况下,我无法看到AllgatherV将如何使用计数和位移。我的目的是只交换结构的一些成员,以减少通信开销。
答案 0 :(得分:0)
您的代码几乎是正确的。缺少的是调整结构的大小,使MPI类型的完整扩展与您的结构对齐。这可以通过以下方式使用MPI_Type_create_resized()
函数来实现:
MPI_Datatype myHollowStruct;
MPI_Type_create_resized( MPI_Position_type, 0, sizeof( bodyType ), &myHollowStruct );
MPI_Type_commit( &myHollowStruct );
MPI_Type_free( &MPI_Position_type );
现在,myHollowStruct
应该代表您想要的内容,即bodytype
结构上仅包含x
和y
字段的掩码,但避免使用z
保持正确的扩展以正确对齐这些结构的数组。
如果从那里你仍然遇到段错误,那么这将是另一个原因,可能在调用MPI_Allgatherv()
时出现了一些错误。
注意:命名自己的MPI_Datatype
MPI_Position_type
是一个坏主意,因为使用MPI_
或PMPI_
作为前缀是为MPI库保留的标准(API和内部),因此禁止用户使用。