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
结构上的掩码仅跟踪 x
和 y
字段,但避免 z
同时保持正确的扩展以与这些结构的数组正确对齐。
如果从那里你仍然遇到段错误,那可能是另一个原因,可能是调用 MPI_Allgatherv()
.
时的一些错误
注意:命名您自己的 MPI_Datatype
MPI_Position_type
是一个坏主意,因为使用 MPI_
或 PMPI_
作为前缀是为 MPI 库保留的标准( API 和内部),因此禁止用户使用。
我有一个类型的结构:
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
结构上的掩码仅跟踪 x
和 y
字段,但避免 z
同时保持正确的扩展以与这些结构的数组正确对齐。
如果从那里你仍然遇到段错误,那可能是另一个原因,可能是调用 MPI_Allgatherv()
.
注意:命名您自己的 MPI_Datatype
MPI_Position_type
是一个坏主意,因为使用 MPI_
或 PMPI_
作为前缀是为 MPI 库保留的标准( API 和内部),因此禁止用户使用。