OpenMPI:广播数组的某些元素
OpenMPI: Broadcasting certain elements of an array
我需要我的进程拥有源数组的副本,然后让进程有选择地操作数组的某些元素,然后当一切完成时,我需要更新所有进程的源数组,方法是更改不同的来自不同进程的数组元素。在操作开始之前,所有进程都必须拥有相同的数组。下面的代码可以说明问题:
#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 数字没有按预期出现,我认为这是两个进程的内存地址不同的问题。我该如何解决这个问题?
至少你的部分问题是由这条语句引起的
MPI_Bcast(&array[k],1,MPI_INT,id,MPI_COMM_WORLD);
因为 id
对每个进程都有不同的值。
广播的整个概念是一个进程向所有其他进程发送值。在对 MPI_Bcast
的调用中,这里的第四个参数 id
标识执行发送的进程,并且在参与广播的每个进程上应该是相同的值。您可能应该将其更改为 0
。或者可能 k
.
将数组的初始状态广播到所有进程后,您就可以考虑在每个进程上对其进行操作,然后再将数据收集回根进程。我认为你太聪明了,试图通过多次调用 MPI_Bcast
.
在一个循环中完成所有这些
我需要我的进程拥有源数组的副本,然后让进程有选择地操作数组的某些元素,然后当一切完成时,我需要更新所有进程的源数组,方法是更改不同的来自不同进程的数组元素。在操作开始之前,所有进程都必须拥有相同的数组。下面的代码可以说明问题:
#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 数字没有按预期出现,我认为这是两个进程的内存地址不同的问题。我该如何解决这个问题?
至少你的部分问题是由这条语句引起的
MPI_Bcast(&array[k],1,MPI_INT,id,MPI_COMM_WORLD);
因为 id
对每个进程都有不同的值。
广播的整个概念是一个进程向所有其他进程发送值。在对 MPI_Bcast
的调用中,这里的第四个参数 id
标识执行发送的进程,并且在参与广播的每个进程上应该是相同的值。您可能应该将其更改为 0
。或者可能 k
.
将数组的初始状态广播到所有进程后,您就可以考虑在每个进程上对其进行操作,然后再将数据收集回根进程。我认为你太聪明了,试图通过多次调用 MPI_Bcast
.