【问题标题】:MPI: all to all broadcast on one dimensional arrayMPI:在一维数组上全部广播
【发布时间】:2011-08-23 06:59:47
【问题描述】:

我有多个处理器和一个数组,每个处理器将它们的工作填充到一维数组中,例如:

  • dense_process_array 用于进程 1: |进程1|0000000000000|
  • dense_process_array 用于进程 2: |000000|进程2|000000|

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

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

(like 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 的新手,基本上我想全部广播。

【问题讨论】:

    标签: mpi parallel-processing


    【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 2013-09-27
      • 2018-05-20
      • 2019-03-02
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多