MPI_Allgather产生不一致的结果

时间:2011-12-09 12:20:47

标签: c parallel-processing mpi openmpi

我在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建议对我的初始问题很有用,但实际上不会为此工作(我不认为)。

1 个答案:

答案 0 :(得分:0)

mpi-default-dev最近的更新似乎解决了这个问题 - 当我找出可能修复了哪些更改时,我会发布更多详细信息。