[英]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.