将MPI DataType返回到MPI Gather

returning MPI DataType to MPI Gather

本文关键字:MPI Gather DataType 返回      更新时间:2023-10-16

我有以下MPI_DataType代码

typedef struct resultset {
    int rank, totalProcessed, bracket1, bracket2, bracket3, bracket4;
    float bracket1percent, bracket2percent, bracket3percent, bracket4percent;
} resultset;
MPI_Datatype createResultType()
{
    // Set-up the arguments for the type constructor
    MPI_Datatype new_type;
    int count = 2;
    int blocklens[] = { 6, 4 };
    MPI_Aint indices[2];
    indices[0] = 0;
    MPI_Type_extent( MPI_FLOAT, &indices[1] );
    indices[1] *= 4;    // There are 4 float
    MPI_Datatype old_types[] = { MPI_INT, MPI_FLOAT };
    // Call the data type constructor
    MPI_Type_struct(count, blocklens, indices, old_types, &new_type);
    MPI_Type_commit(&new_type);
    return new_type;
}

我正试图使用以下代码从其他进程接收数据。rank是一个整数,用于定义进程的等级。

MPI_Datatype resType = createResultType();
if(rank != 0){
    MPI_Gather(&results, sizeof(resultset), resType, NULL, 1, resType, 0, MPI_COMM_WORLD);
}
else {
    resultset* all_results = new resultset[numProcs];
    MPI_Gather(&results, sizeof(resultset), resType, all_results, sizeof(resultset), resType, 0, MPI_COMM_WORLD);
}

问题是,我无法使用以下方法循环遍历all_results:

for(int i = 0; i < numProcs; ++i){
    std::cout << all_results[i].rank << " processed " << all_results[i].totalProcessed <<std::endl;
}

我相信问题出在我的数据类型上,但我不确定。如有任何建议,我们将不胜感激。

编辑:我遇到了循环的问题,现在我得到了不完整的数据。我在聚集函数中将sizeof(resultset)更改为1。现在我收到了正确的数据,除了最后两个浮动是-431602080,而不是0.002223327654。

MPI_Datatype resType = createResultType();
if(rank != 0){
    MPI_Gather(&results, 1, resType, NULL, 1, resType, 0, MPI_COMM_WORLD);
}
else {
    resultset* all_results = new resultset[numProcs];
    MPI_Gather(&results, 1, resType, all_results, 1, resType, 0, MPI_COMM_WORLD);
}

浮动需要为"6"

int blocklens[] = { 6, 4 };

int blocklens[] = { 6, 6 };