MPI:全部在一维阵列上广播

时间:2011-05-11 12:40:20

标签: mpi parallel-processing

我有多个处理器和一个阵列,每个处理器将其工作填充到一维数组中,如:

  • 进程1的dense_process_array: |过程1 | 0000000000000 |
  • 进程2的dense_process_array: | 000000 |过程2 | 000000 |

每个进程填充它们的间隔,然后我希望所有处理器将其他结果放入相同的数组中。

  • 过程1 => dense_process_array | process1 | process2 | ..... | processN |
  • 流程2 ...流程N

(与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。

1 个答案:

答案 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