c - 使用 MPI_Gather 将所有进程计算出的总和收集到一个数组中

标签 c parallel-processing mpi

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

但是, printf("\nSUMS[%d] = %d",i,sums[i]); 行打印出的总和与 printf("中打印的总和不同\n我是进程 %d,我的总和是 %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);

如果不起作用,请告诉我们!

关于c - 使用 MPI_Gather 将所有进程计算出的总和收集到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34107281/

相关文章:

c - 如何在没有确定输入量的情况下使用 scanf

c - 打印结构的 int 成员变量给出了错误的值

c - 运行具有多个输入文件和进程数的 MPI 程序

c - 在二叉树中插入一个元素

c - 与openmp中线程数相关的性能

parallel-processing - 平行Delaunay三角剖分

java - 使用 OpenCl 与 java 的异构计算

c - MPI malloc vs MPI_Alloc_mem 何时使用?

c++ - 段错误 : Struct Serialisation and MPI Data Transfer in C++

c - 如果 hostent 中的指针没有被释放,gethostbyname_r 会泄漏内存吗?