Ignore:
Timestamp:
09/10/20 13:51:02 (4 years ago)
Author:
ymipsl
Message:

Big update on on going work related to data distribution and transfer between clients and servers.
Revisite of the source and store filter using "connectors".

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/grid_remote_connector.cpp

    r1918 r1930  
    1919  { 
    2020    // generic method, every element can be distributed 
     21    int nDst = dstView_.size() ; 
     22    vector<size_t> dstSliceSize(nDst) ; 
     23    dstSliceSize[0] = 1 ;   
     24    for(int i=1; i<nDst; i++)  dstSliceSize[i] = dstView_[i-1]->getGlobalSize()*dstSliceSize[i-1] ; 
     25   
     26    CClientClientDHTTemplate<int>::Index2VectorInfoTypeMap dataInfo ; 
     27 
     28    CClientClientDHTTemplate<size_t>::Index2VectorInfoTypeMap info ; // info map 
     29    for(int pos=0; pos<nDst; pos++) 
     30    { 
     31      size_t sliceSize=dstSliceSize[pos] ; 
     32      map<int,CArray<size_t,1>> globalIndexView ; 
     33      dstView_[pos]->getGlobalIndexView(globalIndexView) ; 
     34       
     35      CClientClientDHTTemplate<size_t>::Index2VectorInfoTypeMap lastInfo(info) ; 
     36 
     37      if (pos>0) 
     38      { 
     39        CArray<size_t,1> ranks(globalIndexView.size()) ; 
     40        auto it=globalIndexView.begin() ; 
     41        for(int i=0 ; i<ranks.numElements();i++,it++) ranks(i)=it->first ; 
     42        CClientClientDHTTemplate<size_t> dataRanks(info, localComm_) ; 
     43        dataRanks.computeIndexInfoMapping(ranks) ; 
     44        lastInfo = dataRanks.getInfoIndexMap() ; 
     45      } 
     46       
     47      info.clear() ; 
     48      for(auto& it : globalIndexView) 
     49      { 
     50        int rank = it.first ; 
     51        auto& globalIndex = it.second ; 
     52        auto& inf = info[rank] ; 
     53        if (pos==0) for(int i=0;i<globalIndex.numElements();i++) inf.push_back(globalIndex(i)) ; 
     54        else 
     55        { 
     56          auto& lastGlobalIndex = lastInfo[rank] ; 
     57          for(size_t lastGlobalInd : lastGlobalIndex) 
     58          { 
     59            for(int i=0;i<globalIndex.numElements();i++) inf.push_back(globalIndex(i)*sliceSize+lastGlobalInd) ; 
     60          } 
     61        }  
     62      } 
     63 
     64      if (pos==nDst-1) 
     65      { 
     66         for(auto& it : info) 
     67         { 
     68           int rank=it.first ; 
     69           auto& globalIndex = it.second ; 
     70           for(auto globalInd : globalIndex) dataInfo[globalInd].push_back(rank) ; 
     71         } 
     72      }  
     73    } 
     74 
     75    CClientClientDHTTemplate<int> dataRanks(dataInfo, localComm_) ; 
     76/* 
    2177    CClientClientDHTTemplate<int>::Index2VectorInfoTypeMap info ; // info map 
    2278         
     
    3793     
    3894    CClientClientDHTTemplate<int> dataRanks(info, localComm_) ; 
    39      
     95*/     
    4096    // generate list of global index for src view 
    4197    int nSrc = srcView_.size() ; 
    4298    vector<size_t> srcSliceSize(nSrc) ; 
    43     srcSliceSize[nSrc-1] = 1 ; 
    44     for(int i=nSrc-2; i>=0; i--)  srcSliceSize[i] = srcView_[i+1]->getGlobalSize()*srcSliceSize[i+1] ; 
    45      
     99//    srcSliceSize[nSrc-1] = 1 ; 
     100//    for(int i=nSrc-2; i>=0; i--)  srcSliceSize[i] = srcView_[i+1]->getGlobalSize()*srcSliceSize[i+1] ; 
     101    
     102    srcSliceSize[0] = 1 ;   
     103    for(int i=1; i<nSrc; i++)  srcSliceSize[i] = srcView_[i-1]->getGlobalSize()*srcSliceSize[i-1] ; 
     104 
    46105    vector<size_t> srcGlobalIndex ; 
    47106    size_t sliceIndex=0 ; 
     
    54113    vector<map<int, set<size_t>>> elements(nSrc) ; // internal representation of elements composing the grid 
    55114 
    56     srcSliceSize[nSrc-1] = srcView_[nSrc-1]->getGlobalSize() ; 
    57     for(int i=nSrc-2 ; i>=0 ; i--) srcSliceSize[i] = srcView_[i]->getGlobalSize()*srcSliceSize[i+1] ; 
     115//    srcSliceSize[nSrc-1] = srcView_[nSrc-1]->getGlobalSize() ; 
     116//    for(int i=nSrc-2 ; i>=0 ; i--) srcSliceSize[i] = srcView_[i]->getGlobalSize()*srcSliceSize[i+1] ; 
    58117 
    59118    for(auto& indRanks : returnInfo) 
     
    61120      size_t gridIndexGlo=indRanks.first ; 
    62121      auto& ranks = indRanks.second ; 
    63       for(int i=0;i<nSrc;i++) 
     122      for(int i=nSrc-1; i>=0; i--) 
    64123      { 
    65124        auto& element = elements[i] ; 
    66         size_t localIndGlo = gridIndexGlo % srcSliceSize[i] ; 
     125        size_t localIndGlo = gridIndexGlo / srcSliceSize[i] ; 
     126        gridIndexGlo = gridIndexGlo % srcSliceSize[i] ; 
    67127        for(int rank : ranks) element[rank].insert(localIndGlo) ; 
    68128      } 
Note: See TracChangeset for help on using the changeset viewer.