我有多个处理器和一个阵列,每个处理器将其工作填充到一维数组中,如:
每个进程填充它们的间隔,然后我希望所有处理器将其他结果放入相同的数组中。
(与all2all bcast一样)因此,每个进程都调用此函数:
void doCommunication(int id, int numprocs, int start_point, int end_point) {
int size_of_length = end_point - start_point + 1;
MPI_Scatter(dense_process_array+start_point, size_of_length, MPI_DOUBLE, dense _process_array +start_point, size_of_length, MPI_DOUBLE, id, MPI_COMM_WORLD;
}
但是,最后当我从任何进程查看我的数组时,我发现它无法获得其他进程的结果,你能提出什么建议吗?
不是:我是MPI的新手,基本上我想全部都是bcast。
答案 0 :(得分:1)
我相信你正在寻找MPI_Allgather:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
void printdata(int size, int rank, int n, int *data) {
printf("Rank %d\n",rank);
for (int j=0; j<size*n; j++)
printf("%d ",data[j]);
printf("\n");
}
int main(int argc, char **argv) {
const int n=3;
int ierr, rank, size;
int *datain, *dataout;
ierr = MPI_Init(&argc, &argv);
ierr|= MPI_Comm_size(MPI_COMM_WORLD,&size);
ierr|= MPI_Comm_rank(MPI_COMM_WORLD,&rank);
datain = (int *)malloc(n*size*sizeof(int));
dataout = (int *)malloc(n*size*sizeof(int));
for (int i=0; i<n*size; i++)
datain[i]=9;
for (int i=0; i<n; i++)
datain[rank*n+i]=rank;
if (rank == 0) printf("Before:\n");
printdata(size, rank, n, datain);
MPI_Allgather(&(datain[rank*n]), n, MPI_INT, dataout, n, MPI_INT, MPI_COMM_WORLD);
if (rank == 0) printf("After:\n");
printdata(size, rank, n, dataout);
free(datain);
free(dataout);
MPI_Finalize();
return 0;
}
跑步给出
$ mpirun -np 3 ./allgather
Before:
Rank 0
0 0 0 9 9 9 9 9 9
Rank 1
9 9 9 1 1 1 9 9 9
Rank 2
9 9 9 9 9 9 2 2 2
After:
Rank 0
0 0 0 1 1 1 2 2 2
Rank 1
0 0 0 1 1 1 2 2 2
Rank 2
0 0 0 1 1 1 2 2 2