Ignore:
Timestamp:
08/30/17 15:33:51 (7 years ago)
Author:
mhnguyen
Message:

Various bug fixes on mask and zoom

+) Rearrange local index on the receiving side to be coherent global index
+) Include masking information in compress data (data_index) on the receiving side
+) Correct zoom to work in case there are several (not all) processes participating to write data

Test
+) On Curie
+) Simple test

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/axis.cpp

    r1236 r1249  
    2323      , isClientAfterTransformationChecked(false) 
    2424      , hasBounds(false), isCompressible_(false) 
    25       , numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 
     25      , numberWrittenIndexes_(), totalNumberWrittenIndexes_(), offsetWrittenIndexes_() 
    2626      , transformationMap_(), hasValue(false), hasLabel(false) 
    2727      , computedWrittenIndex_(false) 
     
    3434      , isClientAfterTransformationChecked(false) 
    3535      , hasBounds(false), isCompressible_(false) 
    36       , numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 
     36      , numberWrittenIndexes_(), totalNumberWrittenIndexes_(), offsetWrittenIndexes_() 
    3737      , transformationMap_(), hasValue(false), hasLabel(false) 
    3838      , computedWrittenIndex_(false) 
     
    107107     \return the number of indexes written by each server 
    108108   */ 
    109    int CAxis::getNumberWrittenIndexes() const 
    110    { 
    111      return numberWrittenIndexes_; 
     109   int CAxis::getNumberWrittenIndexes(MPI_Comm writtenCom) 
     110   { 
     111     int writtenSize; 
     112     MPI_Comm_size(writtenCom, &writtenSize); 
     113     return numberWrittenIndexes_[writtenSize]; 
    112114   } 
    113115 
     
    116118     \return the total number of indexes written by the servers 
    117119   */ 
    118    int CAxis::getTotalNumberWrittenIndexes() const 
    119    { 
    120      return totalNumberWrittenIndexes_; 
     120   int CAxis::getTotalNumberWrittenIndexes(MPI_Comm writtenCom) 
     121   { 
     122     int writtenSize; 
     123     MPI_Comm_size(writtenCom, &writtenSize); 
     124     return totalNumberWrittenIndexes_[writtenSize]; 
    121125   } 
    122126 
     
    125129     \return the offset of indexes written by each server 
    126130   */ 
    127    int CAxis::getOffsetWrittenIndexes() const 
    128    { 
    129      return offsetWrittenIndexes_; 
    130    } 
    131  
     131   int CAxis::getOffsetWrittenIndexes(MPI_Comm writtenCom) 
     132   { 
     133     int writtenSize; 
     134     MPI_Comm_size(writtenCom, &writtenSize); 
     135     return offsetWrittenIndexes_[writtenSize]; 
     136   } 
     137 
     138   CArray<int, 1>& CAxis::getCompressedIndexToWriteOnServer(MPI_Comm writtenCom) 
     139   { 
     140     int writtenSize; 
     141     MPI_Comm_size(writtenCom, &writtenSize); 
     142     return compressedIndexToWriteOnServer[writtenSize]; 
     143   } 
    132144   //---------------------------------------------------------------- 
    133145 
     
    692704    } 
    693705 
     706    // if (isCompressible()) 
     707    // { 
     708    //   nbWritten = 0; 
     709    //   boost::unordered_map<size_t,size_t> localGlobalIndexMap; 
     710    //   for (itSrv = itSrvb; itSrv != itSrve; ++itSrv) 
     711    //   { 
     712    //     indGlo = *itSrv; 
     713    //     if (ite != globalLocalIndexMap_.find(indGlo)) 
     714    //     { 
     715    //       localGlobalIndexMap[localIndexToWriteOnServer(nbWritten)] = indGlo; 
     716    //       ++nbWritten; 
     717    //     }                  
     718    //   } 
     719 
     720    //   nbWritten = 0; 
     721    //   for (int idx = 0; idx < data_index.numElements(); ++idx) 
     722    //   { 
     723    //     if (localGlobalIndexMap.end() != localGlobalIndexMap.find(data_index(idx))) 
     724    //     { 
     725    //       ++nbWritten; 
     726    //     } 
     727    //   } 
     728 
     729    //   compressedIndexToWriteOnServer.resize(nbWritten); 
     730    //   nbWritten = 0; 
     731    //   for (int idx = 0; idx < data_index.numElements(); ++idx) 
     732    //   { 
     733    //     if (localGlobalIndexMap.end() != localGlobalIndexMap.find(data_index(idx))) 
     734    //     { 
     735    //       compressedIndexToWriteOnServer(nbWritten) = localGlobalIndexMap[data_index(idx)]; 
     736    //       ++nbWritten; 
     737    //     } 
     738    //   } 
     739 
     740    //   numberWrittenIndexes_ = nbWritten; 
     741    //   if (isDistributed()) 
     742    //   { 
     743              
     744    //     MPI_Allreduce(&numberWrittenIndexes_, &totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 
     745    //     MPI_Scan(&numberWrittenIndexes_, &offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 
     746    //     offsetWrittenIndexes_ -= numberWrittenIndexes_; 
     747    //   } 
     748    //   else 
     749    //     totalNumberWrittenIndexes_ = numberWrittenIndexes_; 
     750    // } 
     751  } 
     752 
     753  void CAxis::computeWrittenCompressedIndex(MPI_Comm writtenComm) 
     754  { 
     755    int writtenCommSize; 
     756    MPI_Comm_size(writtenComm, &writtenCommSize); 
     757    if (compressedIndexToWriteOnServer.find(writtenCommSize) != compressedIndexToWriteOnServer.end()) 
     758      return; 
     759 
    694760    if (isCompressible()) 
    695761    { 
    696       nbWritten = 0; 
     762      size_t nbWritten = 0, indGlo; 
     763      CContext* context=CContext::getCurrent();       
     764      CContextServer* server = context->server;  
     765 
     766      // We describe the distribution of client (server) on which data are written 
     767      std::vector<int> nBegin(1), nSize(1), nBeginGlobal(1), nGlob(1); 
     768      nBegin[0]       = zoom_begin; 
     769      nSize[0]        = zoom_n;    
     770      nBeginGlobal[0] = 0;  
     771      nGlob[0]        = n_glo; 
     772      CDistributionServer srvDist(server->intraCommSize, nBegin, nSize, nBeginGlobal, nGlob);  
     773      const CArray<size_t,1>& writtenGlobalIndex  = srvDist.getGlobalIndex(); 
     774      boost::unordered_map<size_t,size_t>::const_iterator itb = globalLocalIndexMap_.begin(), 
     775                                                          ite = globalLocalIndexMap_.end(), it;    
     776 
     777      CArray<size_t,1>::const_iterator itSrvb = writtenGlobalIndex.begin(), 
     778                                       itSrve = writtenGlobalIndex.end(), itSrv; 
    697779      boost::unordered_map<size_t,size_t> localGlobalIndexMap; 
    698780      for (itSrv = itSrvb; itSrv != itSrve; ++itSrv) 
     
    715797      } 
    716798 
    717       compressedIndexToWriteOnServer.resize(nbWritten); 
     799      compressedIndexToWriteOnServer[writtenCommSize].resize(nbWritten); 
    718800      nbWritten = 0; 
    719801      for (int idx = 0; idx < data_index.numElements(); ++idx) 
     
    721803        if (localGlobalIndexMap.end() != localGlobalIndexMap.find(data_index(idx))) 
    722804        { 
    723           compressedIndexToWriteOnServer(nbWritten) = localGlobalIndexMap[data_index(idx)]; 
     805          compressedIndexToWriteOnServer[writtenCommSize](nbWritten) = localGlobalIndexMap[data_index(idx)]; 
    724806          ++nbWritten; 
    725807        } 
    726808      } 
    727809 
    728       numberWrittenIndexes_ = nbWritten; 
     810      numberWrittenIndexes_[writtenCommSize] = nbWritten; 
    729811      if (isDistributed()) 
    730812      { 
    731813              
    732         MPI_Allreduce(&numberWrittenIndexes_, &totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 
    733         MPI_Scan(&numberWrittenIndexes_, &offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 
    734         offsetWrittenIndexes_ -= numberWrittenIndexes_; 
     814        MPI_Allreduce(&numberWrittenIndexes_[writtenCommSize], &totalNumberWrittenIndexes_[writtenCommSize], 1, MPI_INT, MPI_SUM, writtenComm); 
     815        MPI_Scan(&numberWrittenIndexes_[writtenCommSize], &offsetWrittenIndexes_[writtenCommSize], 1, MPI_INT, MPI_SUM, writtenComm); 
     816        offsetWrittenIndexes_[writtenCommSize] -= numberWrittenIndexes_[writtenCommSize]; 
    735817      } 
    736818      else 
    737         totalNumberWrittenIndexes_ = numberWrittenIndexes_; 
    738     } 
    739   } 
    740  
     819        totalNumberWrittenIndexes_[writtenCommSize] = numberWrittenIndexes_[writtenCommSize]; 
     820    } 
     821  } 
    741822 
    742823  /*! 
     
    853934    if (zoom_n<=0) 
    854935    { 
    855       zoom_begin = 0; zoom_n = 0; 
     936      zoom_n = 0; zoom_begin=global_zoom_begin; //0; zoom_begin = 0;  
    856937    } 
    857938 
Note: See TracChangeset for help on using the changeset viewer.