MPI 函数长度不同的数据分发和聚集 MPI_Scatterv、MPI_Allgatherv

MPI_Scatterv:分发数据
MPI_Allgatherv 不同长度的数据块收集,等价于依次以Comm中的每个进程为根进程调用MPI_Gatherv 或是以任一进程为跟进调用一次普通收集,紧接着再对收集到的数据进行一次广播。

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include<malloc.h>
//MPI_Scatterv

void TestAllGatherrv(int argc,char**argv){
     const int localSize=100,nProcess=8,globalSize=100;
     int globalData[globalSize],localData[localSize],count[nProcess],disp[nProcess];
     int comRank,comSize,i;

     MPI_Init(&argc,&argv);
     MPI_Comm_rank(MPI_COMM_WORLD,&comRank);
     MPI_Comm_size(MPI_COMM_WORLD,&comSize);
     if(comRank==0)
         for(i=0;i<globalSize;globalData[i]=i,i++);
     else
        for(i=0;i<globalSize;globalData[i]=0,i++);

     for(i=0;i<localSize;localData[i++]=-1);
     for(i=0;i<comSize;count[i]=i+1,i++);
     for (disp[0] = 0, i = 1; i < comSize; disp[i] = disp[i - 1] + count[i - 1], i++);

     MPI_Scatterv(globalData, count, disp, MPI_INT, localData, count[comRank], MPI_INT, 0, MPI_COMM_WORLD);  // 分发数据

     printf("rank=%d ,REceived: ",comRank);
     for (int i = 0; i < count[comRank]; i++) {
         printf("%d\t",localData[i]);
    }
    printf("\n");


     for (i = 0; i < count[comRank]; i++)
       localData[i] += comRank;

     printf("rank=%d ,REceived+ID: ",comRank);
     for (int i = 0; i < count[comRank]; i++) {
         printf("%d\t",localData[i]);
    }
    printf("\n");


     MPI_Allgatherv(localData, count[comRank], MPI_INT, globalData, count, disp, MPI_INT, MPI_COMM_WORLD);   // 聚集数据
      printf("globalData:\n");
     for (i = 0; i < globalSize; i++)
         printf("%d ", globalData[i]);

     printf("\n");

    MPI_Finalize();
}
int main(int argc, char *argv[])
{
    //TestScatterv(argc,argv);
    TestAllGatherrv(argc,argv);
    return 0;


}

编译上述代码:mpicc -o3 mpi_gather.cpp -o mpi_gather -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lcudart -lcuda -I/usr/local/nccl/include -L/usr/local/nccl/lib -l nccl

执行: mpirun -n 4 mpi_gather
输出:

rank=0 ,REceived: 0 
rank=0 ,REceived+ID: 0  
rank=1 ,REceived: 1 2   
rank=1 ,REceived+ID: 2  3   
rank=3 ,REceived: 6 7   8   9   
rank=3 ,REceived+ID: 9  10  11  12  
rank=2 ,REceived: 3 4   5   
rank=2 ,REceived+ID: 5  6   7   
globalData:
0 2 3 5 6 7 9 10 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
globalData:
0 2 3 5 6 7 9 10 11 12 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
globalData:
0 2 3 5 6 7 9 10 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
globalData:
0 2 3 5 6 7 9 10 11 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

猜你喜欢

转载自blog.csdn.net/TH_NUM/article/details/81130891
mpi