1 #ifndef _CC_GRID_ 2 #define _CC_GRID_ 3 4 namespace combblas { 5 6 class CCGrid 7 { 8 public: CCGrid(int c_factor,int gr_cols)9 CCGrid(int c_factor, int gr_cols): GridLayers(c_factor), GridCols(gr_cols), GridRows(gr_cols) 10 { 11 MPI_Comm_rank(MPI_COMM_WORLD,&myrank); 12 MPI_Comm_size(MPI_COMM_WORLD,&nprocs); 13 14 layer_grid = myrank % c_factor; /* RankInFiber = layer_grid, indexed from 1 to c_factor */ 15 RankInLayer = myrank / c_factor; /* indexed from 1 to layer_length */ 16 RankInCol = RankInLayer / GridCols; /* RankInCol = MYPROCROW */ 17 RankInRow = RankInLayer % GridCols; /* RankInRow = MYPROCCOL */ 18 19 // MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm) 20 MPI_Comm_split(MPI_COMM_WORLD, layer_grid, RankInLayer, &layerWorld); 21 MPI_Comm_split(MPI_COMM_WORLD, RankInLayer, layer_grid, &fiberWorld); 22 23 MPI_Comm_split(MPI_COMM_WORLD, layer_grid * GridRows + RankInLayer / GridRows, RankInRow, &rowWorld); 24 MPI_Comm_split(MPI_COMM_WORLD, layer_grid * GridCols + RankInLayer % GridRows, RankInCol, &colWorld); 25 26 27 #ifdef DEBUG 28 printf("Rank %d maps to layer %d (rankinlayer: %d), row %d, and col %d\n", myrank, layer_grid, RankInLayer, RankInCol, RankInRow); 29 #endif 30 }; 31 32 int nprocs; 33 int myrank; 34 int GridRows; 35 int GridCols; 36 int GridLayers; // GridLayers = c_factor 37 int RankInRow; 38 int RankInCol; 39 int RankInLayer; 40 int layer_grid; // layer_grid = RankInFiber 41 MPI_Comm layerWorld; 42 MPI_Comm fiberWorld; 43 MPI_Comm rowWorld; 44 MPI_Comm colWorld; 45 }; 46 47 } 48 49 #endif 50