MPI allgatherv 结构的某些成员

MPI allgatherv certain members of a structure

我有一个类型的结构:

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);

但是我得到了一个段错误。

实际上,我看不出 AllgatherV 在这种情况下将如何使用计数和位移。我的意图是只交换结构的一些成员,以减少通信开销。

您的代码几乎是正确的。缺少的是结构的大小调整,以使 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 结构上的掩码仅跟踪 xy 字段,但避免 z 同时保持正确的扩展以与这些结构的数组正确对齐。

如果从那里你仍然遇到段错误,那可能是另一个原因,可能是调用 MPI_Allgatherv().

时的一些错误

注意:命名您自己的 MPI_Datatype MPI_Position_type 是一个坏主意,因为使用 MPI_PMPI_ 作为前缀是为 MPI 库保留的标准( API 和内部),因此禁止用户使用。