Ignore:
Timestamp:
08/31/18 14:15:54 (6 years ago)
Author:
oabramkina
Message:

Further simplifications on sending data/grid indexes.

(1) Domain/axis mask is not sent anymore. It has been incorporated into data index.

(2) Creating a map that holds grid mask only in case if grid mask is defined.

Still to fix: a hole in a domain or axis.

File:
1 edited

Legend:

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

    r1568 r1570  
    1515   , axisDomainOrder_() 
    1616   , nLocal_(), nGlob_(), nBeginLocal_(), nBeginGlobal_() 
    17    , dataNIndex_(), dataDims_(), dataBegin_(), dataIndex_(), domainMasks_(), axisMasks_() 
     17   , dataNIndex_(), dataDims_(), dataBegin_(), dataIndex_()//, domainMasks_()//, axisMasks_() 
    1818   , gridMask_(), indexMap_() 
    1919   , isDataDistributed_(true), axisNum_(0), domainNum_(0) 
     
    117117  axisDomainOrder_ = axisDomainOrder; 
    118118 
    119   // Each domain or axis has its mask, of course 
    120   domainMasks_.resize(domainNum_); 
    121   for (int i = 0; i < domainNum_;++i) 
    122   { 
    123     domainMasks_[i].resize(domList[i]->domainMask.numElements()); 
    124     domainMasks_[i] = domList[i]->domainMask; 
    125   } 
    126  
    127   axisMasks_.resize(axisNum_); 
    128   for (int i = 0; i < axisNum_; ++i) 
    129   { 
    130     axisMasks_[i].resize(axisList[i]->mask.numElements()); 
    131     axisMasks_[i] = axisList[i]->mask; 
    132   } 
     119//  // Each domain or axis has its mask, of course 
     120//  domainMasks_.resize(domainNum_); 
     121//  for (int i = 0; i < domainNum_;++i) 
     122//  { 
     123//    domainMasks_[i].resize(domList[i]->domainMask.numElements()); 
     124//    domainMasks_[i] = domList[i]->domainMask; 
     125//  } 
     126 
     127//  axisMasks_.resize(axisNum_); 
     128//  for (int i = 0; i < axisNum_; ++i) 
     129//  { 
     130//    axisMasks_[i].resize(axisList[i]->mask.numElements()); 
     131//    axisMasks_[i] = axisList[i]->mask; 
     132//  } 
    133133 
    134134  // Because domain and axis can be in any order (axis1, domain1, axis2, axis3, ) 
     
    282282 
    283283        if ((iIdx >= nBeginLocal_[indexMap_[i]]) && (iIdx < nLocal_[indexMap_[i]]) && 
    284            (jIdx >= nBeginLocal_[indexMap_[i]+1]) && (jIdx < nLocal_[indexMap_[i]+1]) 
    285            && (domainMasks_[idxDomain](iIdx + jIdx*nLocal_[indexMap_[i]]))) 
     284           (jIdx >= nBeginLocal_[indexMap_[i]+1]) && (jIdx < nLocal_[indexMap_[i]+1])) 
     285//           && (domainMasks_[idxDomain](iIdx + jIdx*nLocal_[indexMap_[i]]))) 
    286286        { 
    287287          ++count; 
     
    330330        iIdx = getAxisIndex((dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]); 
    331331        if ((iIdx >= nBeginLocal_[indexMap_[i]]) && 
    332            (iIdx < nLocal_[indexMap_[i]]) && (axisMasks_[idxAxis](iIdx))) 
     332           (iIdx < nLocal_[indexMap_[i]]) )//&& (axisMasks_[idxAxis](iIdx))) 
    333333        { 
    334334          ++count; 
     
    413413 
    414414  for (int i = 0; i < numElement_; ++i) ssize *= eachElementSize[i]; 
    415   while (idx < ssize) 
    416   { 
    417     for (int i = 0; i < numElement_-1; ++i) 
    418     { 
    419       if (idxLoop[i] == eachElementSize[i]) 
    420       { 
    421         idxLoop[i] = 0; 
    422         ++idxLoop[i+1]; 
    423       } 
    424     } 
    425  
    426     // Find out outer index 
    427     // Depending the inner-most element is axis or domain, 
    428     // The outer loop index begins correspondingly at one (1) or zero (0) 
    429     for (int i = 1; i < numElement_; ++i) 
    430     { 
    431       currentIndex[i] = elementLocalIndex_[i](idxLoop[i]); 
    432     } 
    433  
    434     // Inner most index 
    435     for (int i = 0; i < innerLoopSize; ++i) 
    436     { 
    437       int gridMaskIndex = 0; 
    438       currentIndex[0] = elementLocalIndex_[0](i); 
    439  
    440       bool maskTmp = true; 
    441       int idxDomain = 0, idxAxis = 0; 
    442       for (int elem = 0; elem < numElement_; ++elem) 
    443       { 
    444         if (2 == axisDomainOrder_(elem)) 
    445         { 
    446           maskTmp = maskTmp && domainMasks_[idxDomain](currentIndex[elem]); 
    447           ++idxDomain; 
    448         } 
    449         else if (1 == axisDomainOrder_(elem)) 
    450         { 
    451           maskTmp = maskTmp && axisMasks_[idxAxis](currentIndex[elem]); 
    452           ++idxAxis; 
    453         } 
    454       } 
    455       if (maskTmp) ++indexLocalDataOnClientCount; 
    456     } 
    457     idxLoop[0] += innerLoopSize; 
    458     idx += innerLoopSize; 
    459   } 
     415//  while (idx < ssize) 
     416//  { 
     417//    for (int i = 0; i < numElement_-1; ++i) 
     418//    { 
     419//      if (idxLoop[i] == eachElementSize[i]) 
     420//      { 
     421//        idxLoop[i] = 0; 
     422//        ++idxLoop[i+1]; 
     423//      } 
     424//    } 
     425// 
     426//    // Find out outer index 
     427//    // Depending the inner-most element is axis or domain, 
     428//    // The outer loop index begins correspondingly at one (1) or zero (0) 
     429//    for (int i = 1; i < numElement_; ++i) 
     430//    { 
     431//      currentIndex[i] = elementLocalIndex_[i](idxLoop[i]); 
     432//    } 
     433// 
     434//    // Inner most index 
     435//    for (int i = 0; i < innerLoopSize; ++i) 
     436//    { 
     437//      int gridMaskIndex = 0; 
     438//      currentIndex[0] = elementLocalIndex_[0](i); 
     439// 
     440//      bool maskTmp = true; 
     441//      int idxDomain = 0, idxAxis = 0; 
     442//      for (int elem = 0; elem < numElement_; ++elem) 
     443//      { 
     444//        if (2 == axisDomainOrder_(elem)) 
     445//        { 
     446//          maskTmp = maskTmp && domainMasks_[idxDomain](currentIndex[elem]); 
     447//          ++idxDomain; 
     448//        } 
     449//        else if (1 == axisDomainOrder_(elem)) 
     450//        { 
     451//          maskTmp = maskTmp && axisMasks_[idxAxis](currentIndex[elem]); 
     452//          ++idxAxis; 
     453//        } 
     454//      } 
     455//      if (maskTmp) ++indexLocalDataOnClientCount; 
     456//    } 
     457//    idxLoop[0] += innerLoopSize; 
     458//    idx += innerLoopSize; 
     459//  } 
    460460 
    461461  // Now allocate these arrays 
    462   localDataIndex_.resize(indexLocalDataOnClientCount); 
    463   localMaskIndex_.resize(indexLocalDataOnClientCount); 
    464   localMaskedDataIndex_.resize(indexLocalDataOnClientCount); 
    465   globalDataIndex_.rehash(std::ceil(indexLocalDataOnClientCount/globalDataIndex_.max_load_factor())); 
    466   globalLocalDataSendToServerMap_.rehash(std::ceil(indexLocalDataOnClientCount/globalLocalDataSendToServerMap_.max_load_factor())); 
     462//  localDataIndex_.resize(indexLocalDataOnClientCount); 
     463//  localMaskIndex_.resize(indexLocalDataOnClientCount); 
     464//  localMaskedDataIndex_.resize(indexLocalDataOnClientCount); 
     465//  globalDataIndex_.rehash(std::ceil(indexLocalDataOnClientCount/globalDataIndex_.max_load_factor())); 
     466//  globalLocalDataSendToServerMap_.rehash(std::ceil(indexLocalDataOnClientCount/globalLocalDataSendToServerMap_.max_load_factor())); 
     467 
     468  localDataIndex_.resize(ssize); 
     469  if (!gridMask_.isEmpty()) localMaskIndex_.resize(ssize); 
     470  localMaskedDataIndex_.resize(ssize); 
     471  globalDataIndex_.rehash(std::ceil(ssize/globalDataIndex_.max_load_factor())); 
     472  globalLocalDataSendToServerMap_.rehash(std::ceil(ssize/globalLocalDataSendToServerMap_.max_load_factor())); 
     473 
    467474 
    468475  // We need to loop with data index 
     
    524531          bool maskGridTmp = true; 
    525532 
    526           // Domain or axis mask: only unmasked values will be sent 
    527           int idxDomain = 0, idxAxis = 0; 
    528           for (int elem = 0; elem < numElement_; ++elem) 
    529           { 
    530             if (2 == axisDomainOrder_(elem)) 
     533//          // Domain or axis mask: only unmasked values will be sent 
     534//          int idxDomain = 0, idxAxis = 0; 
     535//          for (int elem = 0; elem < numElement_; ++elem) 
     536//          { 
     537//            if (2 == axisDomainOrder_(elem)) 
     538//            { 
     539//              maskTmp = maskTmp && domainMasks_[idxDomain](currentIndex[elem]); 
     540//              ++idxDomain; 
     541//            } 
     542//            else if (1 == axisDomainOrder_(elem)) 
     543//            { 
     544//              maskTmp = maskTmp && axisMasks_[idxAxis](currentIndex[elem]); 
     545//              ++idxAxis; 
     546//            } 
     547//          } 
     548 
     549//          if (maskTmp) 
     550//          { 
     551            size_t globalIndex = 0; 
     552            for (int k = 0; k < numElement_; ++k) 
    531553            { 
    532               maskTmp = maskTmp && domainMasks_[idxDomain](currentIndex[elem]); 
    533               ++idxDomain; 
     554              globalIndex += (currentGlobalIndex[k])*elementNGlobal_[k]; 
    534555            } 
    535             else if (1 == axisDomainOrder_(elem)) 
    536             { 
    537               maskTmp = maskTmp && axisMasks_[idxAxis](currentIndex[elem]); 
    538               ++idxAxis; 
    539             } 
    540           } 
     556            globalDataIndex_[globalIndex] = indexLocalDataOnClientCount; 
     557            localDataIndex_[indexLocalDataOnClientCount] = countLocalData; 
     558            globalLocalDataSendToServerMap_[globalIndex] = indexLocalDataOnClientCount; 
     559            localMaskedDataIndex_[indexLocalDataOnClientCount] = indexLocalDataOnClientCount; 
     560//          } 
    541561 
    542562          // Grid mask: unmasked values will be replaces by NaN and then all values will be sent 
     
    549569            } 
    550570            maskGridTmp =  gridMask_(gridMaskIndex); 
    551           } 
    552  
    553           if (maskTmp) 
    554           { 
    555             size_t globalIndex = 0; 
    556             for (int k = 0; k < numElement_; ++k) 
    557             { 
    558               globalIndex += (currentGlobalIndex[k])*elementNGlobal_[k]; 
    559             } 
    560             globalDataIndex_[globalIndex] = indexLocalDataOnClientCount; 
    561             localDataIndex_[indexLocalDataOnClientCount] = countLocalData; 
    562571            if (maskGridTmp) 
    563572              localMaskIndex_[indexLocalDataOnClientCount] = true; 
    564573            else 
    565574              localMaskIndex_[indexLocalDataOnClientCount] = false; 
    566             globalLocalDataSendToServerMap_[globalIndex] = indexLocalDataOnClientCount; 
    567             localMaskedDataIndex_[indexLocalDataOnClientCount] = indexLocalDataOnClientCount; 
    568             ++indexLocalDataOnClientCount; 
    569575          } 
     576 
     577          ++indexLocalDataOnClientCount; 
     578 
    570579        } 
    571580        ++countLocalData; 
     
    600609                                        const int& dataDim, const int& ni, int& j) 
    601610{ 
     611  int i; 
    602612  int tempI = dataIIndex + dataIBegin, 
    603613      tempJ = (dataJIndex + dataJBegin); 
    604614  if (ni == 0) 
    605615  { 
    606     int i = 0; 
    607     j = 0; 
     616    i = -1; 
     617    j = -1; 
    608618    return i; 
    609619  } 
    610   int i = (dataDim == 1) ? (tempI) % ni 
    611                          : (tempI) ; 
    612   j = (dataDim == 1) ? (tempI) / ni 
    613                      : (tempJ) ; 
    614  
     620  if ((tempI < 0) || (tempJ < 0)) 
     621  { 
     622    i = -1; 
     623    j = -1; 
     624    return i; 
     625  } 
     626  else 
     627  { 
     628    i = (dataDim == 1) ? (tempI) % ni : (tempI) ; 
     629    j = (dataDim == 1) ? (tempI) / ni : (tempJ) ; 
     630  } 
    615631  return i; 
    616632} 
     
    629645    return -1; 
    630646  } 
    631   int tempI = dataIndex; //+ dataBegin; 
     647  int tempI = dataIndex; 
    632648  if ((tempI < 0) || (tempI > ni)) 
    633649    return -1; 
Note: See TracChangeset for help on using the changeset viewer.