0

在大型软件的一部分中,我遇到了 MPI_Allgather 的问题。

下面的函数在每个节点上传递一个不同的双精度和相关标志,然后该函数应该找到全局最小双精度,并将所有节点设置为相应的值。

void set_dt_to_global_min (double *dt, int *flag) {
    int ierr, size;
    ierr = MPI_Comm_size(MPI_COMM_WORLD, &size);

    if (size == 1)
        return;

    typedef struct DT_FLAG_ {
        double dt;
        int flag;
    } DT_FLAG;

    DT_FLAG local;
    DT_FLAG *gathered = (DT_FLAG *) malloc(size * sizeof(*gathered));

    local.dt = *dt;
    local.flag = *flag;

    MPI_Allgather(&local, sizeof(DT_FLAG), MPI_BYTE, gathered, sizeof(DT_FLAG), MPI_BYTE, MPI_COMM_WORLD);

    int i, imin;
    for (imin = 0, i = 1; i < size; ++i) {
        if (gathered[imin].dt > gathered[i].dt) {
            imin = i;
        }
    }

    *dt = gathered[imin].dt;
    *flag = gathered[imin].flag;

    free(gathered);
}

我目前在 6 个节点上运行它,我发现以下错误发生在节点 5(它的 dt 值最小)上:

  • 的真实值gathered[0]被替换为gathered[2]
  • 的真实值gathered[1]被替换为gathered[3]

我认为这可能与 MPI_COMM_WORLD 有关,因为可能会调用 MPI_Comm_Split(); 但是,到目前为止,我还不明白那部分代码。

有人有想法么?

- 编辑:更新了问题以反映我们实际上需要保留一个也与之相关的标志dt- 这意味着@suszterpatt 建议对我最初的问题很有用,但实际上不会起作用(我不认为)为了这。

4

1 回答 1

0

最近的更新mpi-default-dev似乎已经解决了这个问题——当我能弄清楚什么改变可能解决了这个问题时,我会发布更多细节。

于 2012-01-26T10:27:05.537 回答