OpenMPI:广播数组的某些元素

时间:2015-08-11 11:13:26

标签: arrays mpi broadcast openmpi

我需要我的进程拥有源数组的副本,然后让进程选择性地操作数组的某些元素,然后当一切都完成时,我需要更新所有进程的源数组,通过更改不同的元素来自不同进程的数组。在操作开始之前,所有进程必须具有相同的数组。以下代码可以说明问题:

#include <mpi.h>
#include <stdio.h>
int main()
{
    int id, p, array[10];
    MPI_Init(NULL,NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
    MPI_Comm_rank(MPI_COMM_WORLD, &id);
    int k = id;
    while (k<10)
    {
        array[k]=k*(1+id);
        printf("%d %d %d \n",id,k,array[k]);
        MPI_Bcast(&array[k],1,MPI_INT,id,MPI_COMM_WORLD);
        k += p ;
    }
    MPI_Finalize();
    if ( id == 0 )
    {
        for (k=0;k<10;k++)
        {
            printf("%d\n", array[k]);
        }
    }
    return 0;
}

使用np 2运行,我希望输出类似于0,2,2,6,4,10,6,14,8,18。但是,当我得到id = 0数字时, id = 1数字没有按预期出现,我相信这是两个进程的内存地址不一致的问题。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

至少部分问题是由此声明引起的

tr_server

因为 MPI_Bcast(&array[k],1,MPI_INT,id,MPI_COMM_WORLD); 在每个进程上都有不同的值。

广播的整个概念是一个进程将值发送给所有其他进程。在对id的调用中,第四个参数MPI_Bcast在这里标识了发送的进程,并且在参与广播的每个进程上应该是相同的值。您应该将其更改为id。或者可能是0

一旦您将阵列的初始状态广播到所有进程,您就可以考虑在每个进程上操作它,然后再考虑将数据收集回根进程。我认为你太聪明了,试图通过多次调用k来完成所有这一切。