c - 聚集功能

标签 c parallel-processing mpi

在我的程序 i 中,我使用 4 个进程,通过 i 值填充大小为 i + 1 的数组,但是当我在使用 Gatherv 函数后显示 RECEIVED 表时,无法给出正确的结果:[0][1 ][-858993460][2][2][-858993460][3][3][3][-858993460]

#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int buffer[10];
int rank, size, i,receive_counts[4] = { 1, 2, 3,4 },receive_displacements[4] = { 0, 1, 3, 6 };
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (size != 4)
{
    if (rank == 0)
    {
        printf("Please run with 4 processes\n"); fflush(stdout);
    }
    MPI_Finalize();
    return 0;
}
for (i = 0; i<=rank; i++)
{
    buffer[i] = rank;
}   
printf("\n");
MPI_Gatherv(buffer, rank, MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0)
{
    for (i = 0; i<10; i++)
    {
        printf("[%d]", buffer[i]);
    }
    printf("\n");
    fflush(stdout);
}
MPI_Finalize();
return 0;
}

最佳答案

看来你用过这个example作为起点。

由于 rank+1 元素是从每个进程发送的,而不是 rank,因此应相应修改 MPI_Gatherv() 的第二个参数:

MPI_Gatherv(buffer, rank+1, MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);

关于c - 聚集功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332802/

相关文章:

C、MPI : Program not terminating and not printing numbers

c - 共享内存的 MPI_Comm_Size 值

c - 有什么办法可以排除asm函数的编译吗?

c - POSIX 正则表达式表示法以 @ 开头和结尾,正则表达式表示法包含字母数字字符但必须包含 _

haskell - Haskell 中的垃圾收集和并行计算

C# Parallel - 将项目添加到正在迭代的集合中,或等效?

c - 使用 pthread 的简单死锁示例

c++ - U后缀的含义

c# - 是否可以始终使用 Task 强制一个新线程?

c - MPI_Reduce 和 MPI_MIN 如何工作?