Ignore:
Timestamp:
02/11/15 16:23:07 (9 years ago)
Author:
mhnguyen
Message:

Doing some cleans and improving a little bit performance of creating local index on server

+) Add some comments, add some initialization
+) Change the way to calculate local index on server

Test
+) On Curie

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/grid.cpp

    r551 r552  
    1111#include "context.hpp" 
    1212#include "context_client.hpp" 
     13#include "context_server.hpp" 
    1314#include "array_new.hpp" 
    1415 
     
    2223      , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1), isDomConServerComputed_(false) 
    2324      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
     25      , serverDistribution_(0) 
    2426   { 
    2527     setVirtualDomainGroup(); 
     
    3234      , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1), isDomConServerComputed_(false) 
    3335      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
     36      , serverDistribution_(0) 
    3437   { 
    3538     setVirtualDomainGroup(); 
     
    5558 
    5659    if (0 != clientDistribution_) delete clientDistribution_; 
     60    if (0 != serverDistribution_) delete serverDistribution_; 
    5761 
    5862   } 
     
    807811  void CGrid::recvIndex(int rank, CBufferIn& buffer) 
    808812  { 
     813     if (0 == serverDistribution_) 
     814     { 
     815       CContext* context = CContext::getCurrent() ; 
     816       CContextServer* server=context->server ; 
     817       int idx = 0, numElement = axisDomainOrder.numElements(); 
     818       int ssize = numElement; 
     819       std::vector<int> indexMap(numElement); 
     820       for (int i = 0; i < numElement; ++i) 
     821       { 
     822         indexMap[i] = idx; 
     823         if (true == axisDomainOrder(i)) 
     824        { 
     825          ++ssize; 
     826          idx += 2; 
     827        } 
     828       } 
     829 
     830       int axisId = 0, domainId = 0; 
     831       std::vector<CDomain*> domainList = getDomains(); 
     832       std::vector<CAxis*> axisList = getAxis(); 
     833       std::vector<int> nZoomBegin(ssize), nZoomSize(ssize), nGlob(ssize); 
     834       for (int i = 0; i < numElement; ++i) 
     835       { 
     836         if (axisDomainOrder(i)) 
     837         { 
     838            nZoomBegin[indexMap[i]]   = domainList[domainId]->zoom_ibegin_srv; 
     839            nZoomSize[indexMap[i]]    = domainList[domainId]->zoom_ni_srv; 
     840            nGlob[indexMap[i]]    = domainList[domainId]->ni_glo; 
     841 
     842            nZoomBegin[indexMap[i]+1] = domainList[domainId]->zoom_jbegin_srv; 
     843            nZoomSize[indexMap[i]+1]  = domainList[domainId]->zoom_nj_srv; 
     844            nGlob[indexMap[i]+1]    = domainList[domainId]->nj_glo; 
     845            ++domainId; 
     846         } 
     847         else 
     848         { 
     849            nZoomBegin[indexMap[i]] = axisList[axisId]->zoom_begin; 
     850            nZoomSize[indexMap[i]]  = axisList[axisId]->zoom_size; 
     851            nGlob[indexMap[i]]      = axisList[axisId]->size; 
     852            ++axisId; 
     853         } 
     854       } 
     855       serverDistribution_ = new CDistributionServer(server->intraCommRank, nZoomBegin, nZoomSize, nGlob); 
     856     } 
     857 
    809858     CArray<size_t,1> outIndex; 
    810859     buffer>>outIndex; 
     860     serverDistribution_->computeLocalIndex(outIndex); 
    811861     outIndexFromClient.insert(std::pair<int, CArray<size_t,1>* >(rank, new CArray<size_t,1>(outIndex))); 
    812862 
Note: See TracChangeset for help on using the changeset viewer.