【问题标题】:MPI returns incorrect results for one of processesMPI 为其中一个进程返回不正确的结果
【发布时间】:2020-12-15 00:01:51
【问题描述】:

我现在正在学习 MPI,并编写了使用 MPI_Scatter 和 MPI_Reduce 的简单 C 程序,如下所示:

int main(int argc, char **argv)
{
        int mpirank, mpisize;
        int tabsize = atoi(*(argv + 1));

        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &mpirank);
        MPI_Comm_size(MPI_COMM_WORLD, &mpisize);

        unsigned long int sum = 0;
        int rcvsize = tabsize / mpisize;
        int *rcvbuf = malloc(rcvsize * sizeof(int));
        int *tab = malloc(tabsize * sizeof(int));
        int totalsum = 0;

        if(mpirank == 0){

                for(int i=0; i < tabsize; i++){
                        *(tab + i) = 1;
                }


        }
                MPI_Scatter(tab, tabsize/mpisize, MPI_INT, rcvbuf, tabsize/mpisize, MPI_INT, 0, MPI_COMM_WORLD);
   
        for(int i=0; i < tabsize/mpisize; i++){
                sum += *(rcvbuf + i);
        }

        printf("%d sum = %ld %d\n", mpirank, sum, tabsize/mpisize);
        MPI_Reduce(&sum, &totalsum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

        if(mpirank == 0){
                printf("The totalsum = %li\n", totalsum);
        }

        MPI_Finalize();

        return 0;
}

程序给出的结果不一致,我不明白为什么。例如:

$ mpirun -np 4 03_array_sum 120000000
1 sum = 29868633 30000000
2 sum = 30000000 30000000
0 sum = 30000000 30000000
3 sum = 30000000 30000000
The totalsum = 119868633

这里的进程 1 没有计算 MPI_Scatter 给它的所有元素。

更新: 正如用户@Gilles Gouaillardet 在下面接受的答案中所写,我已经为两个版本循环运行代码三十次,$OMPI_MCA_pml 为空并设置为“^ucx”。当标志为空一次运行时,30 次中有 8 次给出错误值,当设置标志时,所有运行都是正确的。然后我在带有 OpenMPI 1.4.5 的 Debian GNU/Linux 7 (wheezy) 上运行相同的程序,并且所有运行都是正确的,带有空标志。 OpenMPI 4.0.4 和/或 Fedora 33 似乎有问题。

【问题讨论】:

  • 这个程序适合我。您使用的是哪个 MPI 库?
  • 请多试几次。它有时会失败,但不应该。我使用'openmpi.x86_64 4.0.4-3.fc33 @fedora 33'
  • @user1337 它也对我有用
  • @dreamcrash 你使用什么 Linux 发行版/版本?什么 MPI 实现和版本?
  • mpirun (Open MPI) 1.8.8, Mac OX High Sierre

标签: c mpi


【解决方案1】:

我能够在相同的环境中重现该问题。

我不知道根本原因是 Open MPI 还是 UCX。

同时,你可以

mpirun --mca pml ^ucx ...

export OMPI_MCA_pml=^ucx
mpirun ...

或添加到/etc/openmpi-x86_64/openmpi-mca-params.conf

pml = ^ucx

【讨论】:

  • 我已经为两个版本循环运行代码三十次,$OMPI_MCA_pml 为空并设置为“^ucx”。当标志为空一次运行时,30 次中有 8 次给出错误值,当设置标志时,所有运行都是正确的。然后我在带有 OpenMPI 1.4.5 的 Debian GNU/Linux 7 (wheezy) 上运行相同的程序,并且所有运行都是正确的,带有空标志。 OpenMPI 4.0.4 和/或 Fedora 33 似乎有问题?
  • 正如我在回答中所写的,根本原因在于 Open MPI 或 UCX 库。
  • 问题报告给 OpenMPI 开发邮件列表。
  • 通过将 ucx 从 1.8 升级到 1.9.0 解决了问题,如 OpenMPI 问题中所述:8321
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2016-02-06
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多