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
我现在正在学习 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