【问题标题】:OpenMPI: Broadcasting certain elements of an arrayOpenMPI:广播数组的某些元素
【发布时间】:2015-11-03 14:08:44
【问题描述】:

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

#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 数字没有按预期出现,我认为这是两个进程的内存地址不同的问题。我该如何解决这个问题?

【问题讨论】:

    标签: arrays mpi broadcast openmpi


    【解决方案1】:

    你的问题至少有一部分是由这句话引起的

        MPI_Bcast(&array[k],1,MPI_INT,id,MPI_COMM_WORLD);
    

    因为id 在每个进程上都有不同的值。

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

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

    【讨论】:

    • 好的,我可以先从id != 0 发送到id == 0,然后让id == 0 广播消息?
    猜你喜欢
    • 2016-09-11
    • 2020-02-13
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多