c++ - 将 MPI 数据类型返回给 MPI Gather

标签 c++ parallel-processing mpi

我有以下 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;
}

我认为问题出在我的数据类型上,但我不确定。任何建议将不胜感激。

编辑:我遇到了遍历它的问题,现在我得到的数据不完整。我在 gather 函数中将 sizeof(resultset) 更改为 1。现在我收到了正确的数据,除了最后 2 个 float 是 -431602080 而不是它们应该是的 0.0022234327654。

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

最佳答案

float 必须为“6”

int blocklens[] = { 6, 4 };

int blocklens[] = { 6, 6 };

关于c++ - 将 MPI 数据类型返回给 MPI Gather,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20234228/

相关文章:

makefile - 如何强制GNU Make不并行构建配方?

asynchronous - 异步 MPI 通信的时间线

python - MPI 中的设计模式 : sleep root process on blocking send and proper load balancing

c++ - MPI_Send 错误

python - 使用 Twisted 在 Python 中实现多进程服务器

c++ - Linux 内核事件 : timeval or timespec

c++ - 在 for 循环中使用 break

c++ - char* const args[] 定义

algorithm - 计算二维函数积分的最佳并行方法

具有由 CTOR 传递的大小的数组成员的 C++ 类