使用 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);
如果还是不行,请告诉我们!
我正在尝试让每个进程计算总和,然后将总和发送回根进程。
但是,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);
如果还是不行,请告诉我们!