使用 MPI_Gather 收集从一个数组中的所有进程计算的总和

Using MPI_Gather to gather the sums calculated from all processes in one array

我正在尝试让每个进程计算总和,然后将总和发送回根进程。

但是,printf("\nSUMS[%d] = %d",i,sums[i]); 行打印出的总和与 printf("\nI am process %d and my sum is %d", my_rank, sum);

中打印的总和不同

只有根的和与sums[0]相同。

有人可以解释为什么会这样吗?对不起,如果这个问题有一个明显的答案,但我是 MPI 的新手。

sum = 0;
for ( i=0 ; i < np; i++)
    sum += y[i];

printf("\nI am process %d and my sum is %d", my_rank, sum);



if (!my_rank)
    sums = (int *)malloc(sizeof(int) * comm_size);

MPI_Gather(&sum, 1, MPI_INT, sums, comm_size, MPI_INT, 0, MPI_COMM_WORLD);

if (!my_rank)
    for ( i = 0; i < comm_size; i++)
        printf("\nSUMS[%d] = %d",i,sums[i]);

根据 mpich 在 MPI_Gather() 上的文档,此函数的第五个参数 recvcount 是任何单个接收的元素数。在您发布的代码中,使用了 comm_size ,但它是要接收的元素总数。因此,以下行可以解决您的问题:

MPI_Gather(&sum, 1, MPI_INT, sums, 1, MPI_INT, 0, MPI_COMM_WORLD);

如果还是不行,请告诉我们!