【发布时间】: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