Ignore:
Timestamp:
04/08/16 15:00:15 (8 years ago)
Author:
mhnguyen
Message:

Improvements for dht

+) Implement adaptive hierarchy for dht, level of hierarchy depends on number of processes
+) Remove some redundant codes

Test
+) On Curie
+) All tests are correct

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/policy.cpp

    r721 r833  
    4949} 
    5050 
     51DivideAdaptiveComm::DivideAdaptiveComm(const MPI_Comm& mpiComm) 
     52  : internalComm_(mpiComm), level_(0), groupBegin_(), nbInGroup_(), computed_(false) 
     53{ 
     54 
    5155} 
    5256 
     57void 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.