Changeset 833 for XIOS/trunk/src/policy.cpp
- Timestamp:
- 04/08/16 15:00:15 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/policy.cpp
r721 r833 49 49 } 50 50 51 DivideAdaptiveComm::DivideAdaptiveComm(const MPI_Comm& mpiComm) 52 : internalComm_(mpiComm), level_(0), groupBegin_(), nbInGroup_(), computed_(false) 53 { 54 51 55 } 52 56 57 void DivideAdaptiveComm::computeMPICommLevel() 58 { 59 if (computed_) return; 60 computed_ = true; 61 62 int mpiSize, mpiRank; 63 MPI_Comm_size(internalComm_,&mpiSize); 64 MPI_Comm_rank(internalComm_,&mpiRank); 65 66 int maxChild=1; 67 int m; 68 do 69 { 70 m=1; 71 ++maxChild; 72 for(int i=0;i<maxChild;++i) m *= maxChild; 73 } while(m<mpiSize); 74 75 int maxLevel=0; 76 for(int size=1; size<=mpiSize; size*=maxChild) ++maxLevel; 77 78 int pos, n, idx; 79 level_=0; 80 int begin=0; 81 int end=mpiSize-1; 82 int nb=end-begin+1; 83 84 nbInGroup_ = groupBegin_= std::vector<int>(maxLevel); 85 nbInGroupParents_ = groupParentsBegin_= std::vector<std::vector<int> >(maxLevel,std::vector<int>(maxChild)); 86 87 groupBegin_[level_] = begin; 88 nbInGroup_[level_] = nb; 89 ++level_; 90 while (nb>2 && (level_<maxLevel)) 91 { 92 n = 0; idx = 0; 93 pos = begin; 94 for(int i=0;i<maxChild && i<nb;i++) 95 { 96 if (i<nb%maxChild) n = nb/maxChild + 1; 97 else n = nb/maxChild; 98 99 if (mpiRank>=pos && mpiRank<pos+n) 100 { 101 begin=pos; 102 end=pos+n-1; 103 } 104 groupParentsBegin_[level_-1][idx] = pos; 105 nbInGroupParents_[level_-1][idx] = n; 106 ++idx; 107 pos=pos+n; 108 } 109 groupBegin_[level_] = begin; 110 nbInGroup_[level_] = nb = end-begin+1; 111 112 ++level_; 113 } 114 115 for (int i = 0; i < nbInGroup_[level_-1];++i) 116 { 117 groupParentsBegin_[level_-1][i] = groupBegin_[level_-1]+i; 118 nbInGroupParents_[level_-1][i] = 1; 119 } 120 121 122 123 // parent=vector<int>(maxLevel+1); 124 // child=vector<vector<int> >(maxLevel+1,vector<int>(maxChild)); 125 // nbChild=vector<int> (maxLevel+1); 126 127 // do 128 // { 129 // n=0; 130 // pos=begin; 131 // nbChild[level_]=0; 132 // parent[level_+1]=begin; 133 // for(int i=0;i<maxChild && i<nb;i++) 134 // { 135 // if (i<nb%maxChild) n = nb/maxChild + 1; 136 // else n = nb/maxChild; 137 // 138 // if (mpiRank>=pos && mpiRank<pos+n) 139 // { 140 // begin=pos; 141 // end=pos+n-1; 142 // } 143 // child[level_][i]=pos; 144 // pos=pos+n; 145 // nbChild[level_]++; 146 // } 147 // nb=end-begin+1; 148 // level_=level_+1; 149 // } while (nb>1); 150 } 151 152 //void DivideAdaptiveComm::divideMPICommLevel(const MPI_Comm& mpiCommLevel, int color, int level) 153 //{ 154 //// int clientRank; 155 //// MPI_Comm_rank(mpiCommLevel,&clientRank); 156 // 157 // --level; 158 // if (0 < level) 159 // { 160 // int color = clientRank % 2; 161 // commLevel_.push_back(MPI_Comm()); 162 // MPI_Comm_split(mpiCommLevel, color, 0, &(commLevel_.back())); 163 // divideMPICommLevel(commLevel_.back(), level); 164 // } 165 //} 166 167 168 } 169
Note: See TracChangeset
for help on using the changeset viewer.