Ignore:
Timestamp:
10/13/15 15:14:23 (9 years ago)
Author:
rlacroix
Message:

Correctly estimate the needed buffer sizes.

The attributes were not considered which could lead to incorrect estimations.

File:
1 edited

Legend:

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

    r730 r731  
    266266   void CContext::setClientServerBuffer() 
    267267   { 
    268      size_t bufferSizeMin = CXios::minBufferSize; 
     268     size_t minBufferSize = CXios::minBufferSize; 
    269269#define DECLARE_NODE(Name_, name_)    \ 
    270      if (bufferSizeMin < sizeof(C##Name_##Definition)) bufferSizeMin = sizeof(C##Name_##Definition); 
     270     if (minBufferSize < sizeof(C##Name_##Definition)) minBufferSize = sizeof(C##Name_##Definition); 
    271271#define DECLARE_NODE_PAR(Name_, name_) 
    272272#include "node_type.conf" 
     
    274274#undef DECLARE_NODE_PAR 
    275275 
    276      std::map<int, StdSize> bufferSize = getDataSize(); 
    277      std::map<int, StdSize>::iterator it  = bufferSize.begin(), 
    278                                       ite = bufferSize.end(); 
    279      for (; it != ite; ++it) 
    280        if (it->second < bufferSizeMin) it->second = bufferSizeMin; 
     276     std::map<int, StdSize> bufferSize = getAttributesBufferSize(); 
     277     std::map<int, StdSize>::iterator it, ite = bufferSize.end(); 
     278     for (it = bufferSize.begin(); it != ite; ++it) 
     279       if (it->second < minBufferSize) it->second = minBufferSize; 
     280 
     281     std::map<int, StdSize> dataBufferSize = getDataBufferSize(); 
     282     ite = dataBufferSize.end(); 
     283     for (it = dataBufferSize.begin(); it != ite; ++it) 
     284       if (it->second > bufferSize[it->first]) bufferSize[it->first] = it->second; 
    281285 
    282286     if (client->isServerLeader()) 
     
    284288       const std::list<int>& ranks = client->getRanksServerLeader(); 
    285289       for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    286          if (!bufferSize.count(*itRank)) bufferSize[*itRank] = bufferSizeMin; 
     290         if (!bufferSize.count(*itRank)) bufferSize[*itRank] = minBufferSize; 
    287291     } 
    288292 
     
    791795   } 
    792796 
    793    std::map<int, StdSize>& CContext::getDataSize() 
     797   std::map<int, StdSize>& CContext::getAttributesBufferSize() 
     798   { 
     799     std::map<int, StdSize> attributesSize; 
     800 
     801     size_t numEnabledFiles = this->enabledFiles.size(); 
     802     for (size_t i = 0; i < numEnabledFiles; ++i) 
     803     { 
     804       CFile* file = this->enabledFiles[i]; 
     805 
     806       std::vector<CField*> enabledFields = file->getEnabledFields(); 
     807       size_t numEnabledFields = enabledFields.size(); 
     808       for (size_t j = 0; j < numEnabledFields; ++j) 
     809       { 
     810         const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(); 
     811         std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end(); 
     812         for (; it != itE; ++it) 
     813         { 
     814           // If attributesSize[it->first] does not exist, it will be zero-initialized 
     815           // so we can use it safely without checking for its existance 
     816           if (attributesSize[it->first] < it->second) 
     817             attributesSize[it->first] = it->second; 
     818         } 
     819       } 
     820     } 
     821 
     822     return attributesSize; 
     823   } 
     824 
     825   std::map<int, StdSize>& CContext::getDataBufferSize() 
    794826   { 
    795827     CFile::mode_attr::t_enum mode = hasClient ? CFile::mode_attr::write : CFile::mode_attr::read; 
     
    810842         for (size_t j = 0; j < numEnabledFields; ++j) 
    811843         { 
    812            const std::map<int, StdSize> mapSize = enabledFields[j]->getGridDataSize(); 
     844           const std::map<int, StdSize> mapSize = enabledFields[j]->getGridDataBufferSize(); 
    813845           std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end(); 
    814846           for (; it != itE; ++it) 
Note: See TracChangeset for help on using the changeset viewer.