MPI_Allgather 产生不一致的结果

Posted

技术标签:

【中文标题】MPI_Allgather 产生不一致的结果【英文标题】:MPI_Allgather produces inconsistent results 【发布时间】:2012-01-16 17:45:38 【问题描述】:

我在大型软件的一部分中遇到了 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 的最小值)only

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

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

有人有什么想法吗?

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

【问题讨论】:

为什么不改用 MPI_Allreduce? @suszterpatt:谢谢,我不知道 MPI_Allreduce(维护遗留代码和学习 MPI)。但是,查看函数后,我认为最初没有使用它的原因是 dt 实际上是传入的结构的一部分(而不是像我在这里指出的那样仅对双精度进行操作的简单情况) )。我会看看我能不能让它工作。 您可以定义要与 Reduce 一起使用的自定义操作。也许这会有所帮助? netlib.org/utk/papers/mpi-book/… 【参考方案1】:

最近对mpi-default-dev 的更新似乎已经解决了这个问题——我会在确定哪些更改可以解决这个问题时发布更多详细信息。

【讨论】:

以上是关于MPI_Allgather 产生不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

Spark rdd.count() 产生不一致的结果

使用 DateComponent 构造 NSDate 会产生不一致的结果

TCC - isNull 产生不一致的结果

XGBoost:softprob 和 softmax 产生不一致的结果

在自定义 UITableViewCell 中调整 UIImageView 的大小会产生不一致的结果

经过多次执行后,CUDA程序的结果不一致