Ignore:
Timestamp:
05/11/17 18:25:20 (7 years ago)
Author:
mhnguyen
Message:

Updating two-level server.
Each client now can play the role of server: It can forward data to other clients or write data like a server.
Each client must combine all data received from other client(s) before forward them or write them on files

+) Correct some bugs of exchange data_index in domain and axis
+) Reorder some functions in context.cpp to make sure that all necessary attributes are available before computing index
+) Add the mapping index for client to write data.

Test
+) On Curie
+) test_client and test_complete
+) Mode:

  • Only one level: Correct
  • Two levels: Work if using ddt (bug)

+) Only zoom is tested but other transformations should work
+) No reading test

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/distribution_server.cpp

    r1099 r1129  
    3737} 
    3838 
    39 CDistributionServer::CDistributionServer(int rank,  
    40                                          const std::vector<CArray<int,1> >& globalIndexEachDimension, 
    41                                          const std::vector<int>& nGlobal) 
    42   : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(), 
    43     nZoomSize_(), nZoomBegin_(), globalLocalIndexMap_(),  
    44     globalIndexEachDimension_(globalIndexEachDimension) 
    45 { 
    46   createGlobalIndexFromIndex(globalIndexEachDimension, nGlobal); 
    47 } 
     39// CDistributionServer::CDistributionServer(int rank,  
     40//                                          const std::vector<CArray<int,1> >& globalIndexEachDimension, 
     41//                                          const std::vector<int>& nGlobal) 
     42//   : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(), 
     43//     nZoomSize_(), nZoomBegin_(), globalLocalIndexMap_(),  
     44//     globalIndexEachDimension_(globalIndexEachDimension) 
     45// { 
     46//   createGlobalIndexFromIndex(globalIndexEachDimension, nGlobal); 
     47// } 
    4848 
    4949CDistributionServer::~CDistributionServer() 
     
    101101} 
    102102 
    103 void CDistributionServer::createGlobalIndexFromIndex(const std::vector<CArray<int,1> >& globalIndexOnEachDimension, 
    104                                                      const std::vector<int>& nbGlobal) 
    105 { 
    106   size_t idx = 0, ssize = 1; 
    107   for (int i = 0; i < globalIndexOnEachDimension.size(); ++i) ssize *= globalIndexOnEachDimension[i].numElements(); 
    108  
    109   this->globalIndex_.resize(ssize); 
    110   size_t nbDim = nbGlobal.size(); 
    111   std::vector<int> idxLoop(nbDim,0); 
    112   std::vector<int> currentIndex(nbDim); 
    113   int innerLoopSize = globalIndexOnEachDimension[0].numElements(); 
    114  
    115   globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); 
    116   while (idx<ssize) 
    117   { 
    118     for (int i = 0; i < nbDim-1; ++i) 
    119     { 
    120       if (idxLoop[i] == globalIndexOnEachDimension[i].numElements()) 
    121       { 
    122         idxLoop[i] = 0; 
    123         ++idxLoop[i+1]; 
    124       } 
    125     } 
    126  
    127     for (int i = 1; i < nbDim; ++i) 
    128       currentIndex[i] = globalIndexOnEachDimension[i](idxLoop[i]); 
    129  
    130     size_t mulDim, globalIndex; 
    131     for (int i = 0; i < innerLoopSize; ++i) 
    132     { 
    133       mulDim = 1; 
    134       globalIndex = globalIndexOnEachDimension[0](i); 
    135  
    136       for (int k = 0; k < nbDim; ++k) 
    137       { 
    138         mulDim *= nbGlobal[k]; 
    139         globalIndex += (currentIndex[k])*mulDim; 
    140       } 
    141       globalLocalIndexMap_[globalIndex] = idx; 
    142       this->globalIndex_(idx) = globalIndex; 
    143  
    144       ++idx; 
    145     } 
    146     idxLoop[0] += innerLoopSize; 
    147   } 
    148  
    149 } 
     103// void CDistributionServer::createGlobalIndexFromIndex(const std::vector<CArray<int,1> >& globalIndexOnEachDimension, 
     104//                                                      const std::vector<int>& nbGlobal) 
     105// { 
     106//   size_t idx = 0, ssize = 1; 
     107//   for (int i = 0; i < globalIndexOnEachDimension.size(); ++i) ssize *= globalIndexOnEachDimension[i].numElements(); 
     108 
     109//   this->globalIndex_.resize(ssize); 
     110//   size_t nbDim = nbGlobal.size(); 
     111//   std::vector<int> idxLoop(nbDim,0); 
     112//   std::vector<int> currentIndex(nbDim); 
     113//   int innerLoopSize = globalIndexOnEachDimension[0].numElements(); 
     114 
     115//   globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); 
     116//   while (idx<ssize) 
     117//   { 
     118//     for (int i = 0; i < nbDim-1; ++i) 
     119//     { 
     120//       if (idxLoop[i] == globalIndexOnEachDimension[i].numElements()) 
     121//       { 
     122//         idxLoop[i] = 0; 
     123//         ++idxLoop[i+1]; 
     124//       } 
     125//     } 
     126 
     127//     for (int i = 1; i < nbDim; ++i) 
     128//       currentIndex[i] = globalIndexOnEachDimension[i](idxLoop[i]); 
     129 
     130//     size_t mulDim, globalIndex; 
     131//     for (int i = 0; i < innerLoopSize; ++i) 
     132//     { 
     133//       mulDim = 1; 
     134//       globalIndex = globalIndexOnEachDimension[0](i); 
     135 
     136//       for (int k = 0; k < nbDim; ++k) 
     137//       { 
     138//         mulDim *= nbGlobal[k]; 
     139//         globalIndex += (currentIndex[k])*mulDim; 
     140//       } 
     141//       globalLocalIndexMap_[globalIndex] = idx; 
     142//       this->globalIndex_(idx) = globalIndex; 
     143 
     144//       ++idx; 
     145//     } 
     146//     idxLoop[0] += innerLoopSize; 
     147//   } 
     148 
     149// } 
    150150 
    151151/*! 
     
    156156CArray<size_t,1> CDistributionServer::computeLocalIndex(const CArray<size_t,1>& globalIndex) 
    157157{ 
    158   int ssize = globalIndex.numElements(); 
    159   CArray<size_t,1> localIndex(ssize); 
     158  size_t ssize = globalIndex.numElements(); 
     159  size_t localIndexSize = std::min(globalIndex_.numElements(), ssize); 
     160  CArray<size_t,1> localIndex(localIndexSize); 
    160161  GlobalLocalMap::const_iterator ite = globalLocalIndexMap_.end(), it; 
    161   for (int idx = 0; idx < ssize; ++idx) 
     162  for (int idx = 0, i = 0; idx < ssize; ++idx) 
    162163  { 
    163164    it = globalLocalIndexMap_.find(globalIndex(idx)); 
    164165    if (ite != it) 
     166    { 
    165167      localIndex(idx) = it->second; 
     168      ++i; 
     169    } 
    166170  } 
    167171 
Note: See TracChangeset for help on using the changeset viewer.