簡體   English   中英

MPI 為其中一個進程返回不正確的結果

[英]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 (wheezy) 上使用 OpenMPI 1.4.5 運行相同的程序,並且所有運行都是正確的,帶有空標志。 OpenMPI 4.0.4 和/或 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM