MPI returns 进程之一的错误结果

MPI returns incorrect results for one of processes

我现在正在学习 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 个给出错误值,当设置标志时,所有 运行 都是正确的。然后我 运行 在 Debian GNU/Linux 7(喘不过气来)和 OpenMPI 1.4.5 上相同,所有 运行s 都是正确的,带有空标志。 OpenMPI 4.0.4 似乎有问题 and/or Fedora 33.

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

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

同时,您可以

mpirun --mca pml ^ucx ...

export OMPI_MCA_pml=^ucx
mpirun ...

或加入/etc/openmpi-x86_64/openmpi-mca-params.conf

pml = ^ucx