Ignore:
Timestamp:
03/23/16 16:11:01 (8 years ago)
Author:
mhnguyen
Message:

Refactoring transformation code

+) On exchanging information during transformation, not only global index are sent but also local index
+) Correct a bug in distributed hash table (dht)
+) Add new type for dht
+) Clean up some redundant codes

Test
+) On Curie
+) Every test passes
+) Code runs faster in some cases (up to 30%)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/transformation/axis_algorithm_transformation.cpp

    r827 r829  
    4949                                                                          const std::vector<int>& gridDestGlobalDim, 
    5050                                                                          const std::vector<int>& gridSrcGlobalDim, 
    51                                                                           const std::vector<size_t>& globalIndexGridDestSendToServer, 
    52                                                                           CArray<size_t,1>& globalIndexDestGrid, 
     51                                                                          const GlobalLocalMap& globalLocalIndexDestSendToServerMap, 
     52                                                                          std::vector<std::pair<size_t,int> >& globalLocalIndexDestMap, 
    5353                                                                          std::vector<std::vector<size_t> >& globalIndexSrcGrid) 
    5454{ 
     
    7272  } 
    7373 
    74   std::vector<size_t>::const_iterator itbArr = globalIndexGridDestSendToServer.begin(), itArr, 
    75                                       iteArr = globalIndexGridDestSendToServer.end(); 
     74  GlobalLocalMap::const_iterator iteArr = globalLocalIndexDestSendToServerMap.end(), it; 
    7675 
    7776  while (idx < ssize) 
     
    111110    } 
    112111 
    113     if (std::binary_search(itbArr, iteArr, globIndex)) ++realGlobalIndexSize; 
     112    if (iteArr != globalLocalIndexDestSendToServerMap.find(globIndex)) ++realGlobalIndexSize; 
    114113    ++idxLoop[0]; 
    115114    ++idx; 
    116115  } 
    117116 
    118   if (globalIndexDestGrid.numElements() != realGlobalIndexSize) 
    119     globalIndexDestGrid.resize(realGlobalIndexSize); 
     117  if (globalLocalIndexDestMap.size() != realGlobalIndexSize) 
     118    globalLocalIndexDestMap.resize(realGlobalIndexSize); 
    120119 
    121120  if (realGlobalIndexSize != globalIndexSrcGrid.size()) globalIndexSrcGrid.resize(realGlobalIndexSize); 
     
    162161    } 
    163162 
    164     if (std::binary_search(itbArr, iteArr, globIndex)) 
     163    it = globalLocalIndexDestSendToServerMap.find(globIndex); 
     164    if (iteArr != it) 
    165165    { 
    166       globalIndexDestGrid(realGlobalIndex) = globIndex; 
     166      globalLocalIndexDestMap[realGlobalIndex] = (std::make_pair(it->first,it->second)); 
    167167      for (int i = 0; i < globalIndexSrcGrid[realGlobalIndex].size(); ++i) 
    168168      { 
     
    183183    ++idx; 
    184184  } 
    185  
    186  
    187  
    188 //  int globalDim = gridDestGlobalDim.size(); 
    189 // 
    190 //  std::vector<size_t> currentIndex(globalDim); 
    191 //  std::vector<int> gridAxisGlobalDim(globalDim); 
    192 //  std::vector<int> idxLoop(globalDim, 0); 
    193 // 
    194 //  size_t ssize = 1, idx = 0, realGlobalIndexSize = 0; 
    195 //  for (int i = 0; i< globalDim; ++i) 
    196 //  { 
    197 //    if (axisPositionInGrid == i) gridAxisGlobalDim[i] = 1; 
    198 //    else gridAxisGlobalDim[i] = gridDestGlobalDim[i]; 
    199 //    ssize *= gridAxisGlobalDim[i]; 
    200 //  } 
    201 // 
    202 //  std::vector<size_t>::const_iterator itbArr = globalIndexGridDestSendToServer.begin(), itArr, 
    203 //                                      iteArr = globalIndexGridDestSendToServer.end(); 
    204 // 
    205 //  while (idx < ssize) 
    206 //  { 
    207 //    for (int i = 0; i < globalDim-1; ++i) 
    208 //    { 
    209 //      if (idxLoop[i] == gridAxisGlobalDim[i]) 
    210 //      { 
    211 //        idxLoop[i] = 0; 
    212 //        ++idxLoop[i+1]; 
    213 //      } 
    214 //    } 
    215 // 
    216 //    for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i]; 
    217 //    currentIndex[axisPositionInGrid] = axisDestGlobalIndex; 
    218 // 
    219 //    size_t globIndex = currentIndex[0]; 
    220 //    size_t mulDim = 1; 
    221 //    for (int k = 1; k < globalDim; ++k) 
    222 //    { 
    223 //      mulDim *= gridDestGlobalDim[k-1]; 
    224 //      globIndex += (currentIndex[k])*mulDim; 
    225 //    } 
    226 // 
    227 //    if (std::binary_search(itbArr, iteArr, globIndex)) ++realGlobalIndexSize; 
    228 //    ++idxLoop[0]; 
    229 //    ++idx; 
    230 //  } 
    231 // 
    232 //  if (globalIndexDestGrid.numElements() != realGlobalIndexSize) 
    233 //    globalIndexDestGrid.resize(realGlobalIndexSize); 
    234 // 
    235 //  if (realGlobalIndexSize != globalIndexSrcGrid.size()) globalIndexSrcGrid.resize(realGlobalIndexSize); 
    236 //  for (int i = 0; i < globalIndexSrcGrid.size(); ++i) 
    237 //    if (globalIndexSrcGrid[i].size() != axisSrcGlobalIndex.size()) 
    238 //      globalIndexSrcGrid[i].resize(axisSrcGlobalIndex.size()); 
    239 // 
    240 //  size_t realGlobalIndex = 0; 
    241 //  idx = 0; 
    242 //  idxLoop.assign(globalDim, 0); 
    243 //  while (idx < ssize) 
    244 //  { 
    245 //    for (int i = 0; i < globalDim-1; ++i) 
    246 //    { 
    247 //      if (idxLoop[i] == gridAxisGlobalDim[i]) 
    248 //      { 
    249 //        idxLoop[i] = 0; 
    250 //        ++idxLoop[i+1]; 
    251 //      } 
    252 //    } 
    253 // 
    254 //    for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i]; 
    255 //    currentIndex[axisPositionInGrid] = axisDestGlobalIndex; 
    256 // 
    257 //    size_t globIndex = currentIndex[0]; 
    258 //    size_t mulDim = 1; 
    259 //    for (int k = 1; k < globalDim; ++k) 
    260 //    { 
    261 //      mulDim *= gridDestGlobalDim[k-1]; 
    262 //      globIndex += (currentIndex[k])*mulDim; 
    263 //    } 
    264 // 
    265 //    if (std::binary_search(itbArr, iteArr, globIndex)) 
    266 //    { 
    267 //      globalIndexDestGrid(realGlobalIndex) = globIndex; 
    268 //      for (int i = 0; i < globalIndexSrcGrid[realGlobalIndex].size(); ++i) 
    269 //      { 
    270 //        currentIndex[axisPositionInGrid] = axisSrcGlobalIndex[i]; 
    271 //        globIndex = currentIndex[0]; 
    272 //        mulDim = 1; 
    273 //        for (int k = 1; k < globalDim; ++k) 
    274 //        { 
    275 //          mulDim *= gridDestGlobalDim[k-1]; 
    276 //          globIndex += (currentIndex[k])*mulDim; 
    277 //        } 
    278 //        (globalIndexSrcGrid[realGlobalIndex])[i] = globIndex; 
    279 //      } 
    280 //      ++realGlobalIndex; 
    281 //    } 
    282 // 
    283 //    ++idxLoop[0]; 
    284 //    ++idx; 
    285 //  } 
    286185} 
    287186} 
Note: See TracChangeset for help on using the changeset viewer.