Ignore:
Timestamp:
06/26/17 16:44:24 (4 years ago)
Author:
oabramkina
Message:

Two server levels: correcting buffer allocations on client side of primary server. The buffer size is calculated according to the number of files sent to each secondary server.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/node/context.cpp

    r1180 r1184  
    289289   } 
    290290 
    291    void CContext::setClientServerBuffer() 
     291   void CContext::setClientServerBuffer(CContextClient* contextClient) 
    292292   { 
    293293     size_t minBufferSize = CXios::minBufferSize; 
     
    300300 
    301301     std::map<int, StdSize> maxEventSize; 
    302      std::map<int, StdSize> bufferSize = getAttributesBufferSize(maxEventSize); 
    303      std::map<int, StdSize> dataBufferSize = getDataBufferSize(maxEventSize); 
     302     std::map<int, StdSize> bufferSize = getAttributesBufferSize(maxEventSize, contextClient); 
     303     std::map<int, StdSize> dataBufferSize = getDataBufferSize(maxEventSize, contextClient); 
    304304 
    305305     std::map<int, StdSize>::iterator it, ite = dataBufferSize.end(); 
     
    319319       if (it->second < minBufferSize) it->second = minBufferSize; 
    320320 
    321      if (client->isServerLeader()) 
    322      { 
    323        const std::list<int>& ranks = client->getRanksServerLeader(); 
     321     if (contextClient->isServerLeader()) 
     322     { 
     323       const std::list<int>& ranks = contextClient->getRanksServerLeader(); 
    324324       for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    325325         if (!bufferSize.count(*itRank)) bufferSize[*itRank] = maxEventSize[*itRank] = minBufferSize; 
    326326     } 
    327      client->setBufferSize(bufferSize, maxEventSize); 
    328  
    329      // If it is primary server pool, also set buffer for clientPrimServer. 
    330      if (hasClient && hasServer) 
    331      { 
    332        for (int i = 0; i < clientPrimServer.size(); ++i) 
    333        { 
    334          if (clientPrimServer[i]->isServerLeader()) 
    335          { 
    336            const std::list<int>& ranks = clientPrimServer[i]->getRanksServerLeader(); 
    337            for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    338              if (!bufferSize.count(*itRank)) bufferSize[*itRank] = maxEventSize[*itRank] = minBufferSize; 
    339          } 
    340          clientPrimServer[i]->setBufferSize(bufferSize, maxEventSize); 
    341        } 
    342      } 
     327     contextClient->setBufferSize(bufferSize, maxEventSize); 
     328 
    343329   } 
    344330 
     
    536522     checkGridEnabledFields();     
    537523 
    538      setClientServerBuffer(); 
     524     setClientServerBuffer(client); 
     525     if (hasServer) 
     526       for (int i = 0; i < clientPrimServer.size(); ++i) 
     527         setClientServerBuffer(clientPrimServer[i]); 
     528 
    539529 
    540530     if (hasClient) 
     
    11971187    * \param maxEventSize [in/out] the size of the bigger event for each connected server 
    11981188    */ 
    1199    std::map<int, StdSize> CContext::getAttributesBufferSize(std::map<int, StdSize>& maxEventSize) 
     1189   std::map<int, StdSize> CContext::getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient) 
    12001190   { 
    12011191     std::map<int, StdSize> attributesSize; 
     
    12071197       { 
    12081198         CFile* file = this->enabledFiles[i]; 
    1209  
    1210          std::vector<CField*> enabledFields = file->getEnabledFields(); 
    1211          size_t numEnabledFields = enabledFields.size(); 
    1212          for (size_t j = 0; j < numEnabledFields; ++j) 
     1199         if (file->getContextClient() == contextClient) 
    12131200         { 
    1214            const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(); 
    1215            std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end(); 
    1216            for (; it != itE; ++it) 
     1201           std::vector<CField*> enabledFields = file->getEnabledFields(); 
     1202           size_t numEnabledFields = enabledFields.size(); 
     1203           for (size_t j = 0; j < numEnabledFields; ++j) 
    12171204           { 
    1218              // If attributesSize[it->first] does not exist, it will be zero-initialized 
    1219              // so we can use it safely without checking for its existance 
    1220              if (attributesSize[it->first] < it->second) 
    1221                attributesSize[it->first] = it->second; 
    1222  
    1223              if (maxEventSize[it->first] < it->second) 
    1224                maxEventSize[it->first] = it->second; 
     1205             const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(); 
     1206             std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end(); 
     1207             for (; it != itE; ++it) 
     1208             { 
     1209               // If attributesSize[it->first] does not exist, it will be zero-initialized 
     1210               // so we can use it safely without checking for its existance 
     1211               if (attributesSize[it->first] < it->second) 
     1212                 attributesSize[it->first] = it->second; 
     1213 
     1214               if (maxEventSize[it->first] < it->second) 
     1215                 maxEventSize[it->first] = it->second; 
     1216             } 
    12251217           } 
    12261218         } 
     
    12361228    * \param maxEventSize [in/out] the size of the bigger event for each connected server 
    12371229    */ 
    1238    std::map<int, StdSize> CContext::getDataBufferSize(std::map<int, StdSize>& maxEventSize) 
     1230   std::map<int, StdSize> CContext::getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient) 
    12391231   { 
    12401232     CFile::mode_attr::t_enum mode = hasClient ? CFile::mode_attr::write : CFile::mode_attr::read; 
     
    12471239     { 
    12481240       CFile* file = this->enabledFiles[i]; 
    1249        CFile::mode_attr::t_enum fileMode = file->mode.isEmpty() ? CFile::mode_attr::write : file->mode.getValue(); 
    1250  
    1251        if (fileMode == mode) 
     1241       if (file->getContextClient() == contextClient) 
    12521242       { 
    1253          std::vector<CField*> enabledFields = file->getEnabledFields(); 
    1254          size_t numEnabledFields = enabledFields.size(); 
    1255          for (size_t j = 0; j < numEnabledFields; ++j) 
     1243         CFile::mode_attr::t_enum fileMode = file->mode.isEmpty() ? CFile::mode_attr::write : file->mode.getValue(); 
     1244 
     1245         if (fileMode == mode) 
    12561246         { 
    1257            const std::vector<std::map<int, StdSize> > mapSize = enabledFields[j]->getGridDataBufferSize(); 
    1258            for (size_t c = 0; c < mapSize.size(); ++c) 
     1247           std::vector<CField*> enabledFields = file->getEnabledFields(); 
     1248           size_t numEnabledFields = enabledFields.size(); 
     1249           for (size_t j = 0; j < numEnabledFields; ++j) 
    12591250           { 
    1260              std::map<int, StdSize>::const_iterator it = mapSize[c].begin(), itE = mapSize[c].end(); 
    1261              for (; it != itE; ++it) 
     1251             const std::vector<std::map<int, StdSize> > mapSize = enabledFields[j]->getGridDataBufferSize(); 
     1252             for (size_t c = 0; c < mapSize.size(); ++c) 
    12621253             { 
    1263                // If dataSize[it->first] does not exist, it will be zero-initialized 
    1264                // so we can use it safely without checking for its existance 
    1265                if (CXios::isOptPerformance) 
    1266                  dataSize[it->first] += it->second; 
    1267                else if (dataSize[it->first] < it->second) 
    1268                  dataSize[it->first] = it->second; 
    1269  
    1270                if (maxEventSize[it->first] < it->second) 
    1271                  maxEventSize[it->first] = it->second; 
     1254               std::map<int, StdSize>::const_iterator it = mapSize[c].begin(), itE = mapSize[c].end(); 
     1255               for (; it != itE; ++it) 
     1256               { 
     1257                 // If dataSize[it->first] does not exist, it will be zero-initialized 
     1258                 // so we can use it safely without checking for its existance 
     1259                 if (CXios::isOptPerformance) 
     1260                   dataSize[it->first] += it->second; 
     1261                 else if (dataSize[it->first] < it->second) 
     1262                   dataSize[it->first] = it->second; 
     1263 
     1264                 if (maxEventSize[it->first] < it->second) 
     1265                   maxEventSize[it->first] = it->second; 
     1266               } 
    12721267             } 
    12731268           } 
Note: See TracChangeset for help on using the changeset viewer.