MPI allgatherv结构的某些成员

时间:2015-12-14 15:56:33

标签: structure mpi

我有一个类型的结构:

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将如何使用计数和位移。我的目的是只交换结构的一些成员,以减少通信开销。

1 个答案:

答案 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结构上仅包含xy字段的掩码,但避免使用z保持正确的扩展以正确对齐这些结构的数组。

如果从那里你仍然遇到段错误,那么这将是另一个原因,可能在调用MPI_Allgatherv()时出现了一些错误。

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