Changeset 1208 for XIOS


Ignore:
Timestamp:
07/11/17 11:34:53 (7 years ago)
Author:
oabramkina
Message:

Two server levels: distibuting files among secondary servers according to the estimated data flux. Tested on Curie.

Location:
XIOS/dev/dev_olga/src
Files:
3 edited

Legend:

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

    r1201 r1208  
    526526     checkGridEnabledFields();     
    527527 
     528     // Distribute files between secondary servers according to the data size 
     529     distributeFiles(); 
     530 
    528531     // Buffer for primary server for connection to client will be allocated by default (to min size) 
    529532     if (CServer::serverLevel != 1) 
     
    815818               << getId() << "\" !"); 
    816819 
    817       // Assigning contextClient to each enabled file 
    818       if (hasClient) 
    819       { 
    820         for (int i = 0; i < enabledFiles.size(); ++i) 
    821         { 
    822           if (hasServer) 
    823           { 
    824             int srvId = i % clientPrimServer.size(); 
    825             enabledFiles[i]->setContextClient(clientPrimServer[srvId]); 
    826           } 
    827           else 
    828             enabledFiles[i]->setContextClient(client); 
    829         } 
    830       } 
     820   } 
     821 
     822   void CContext::distributeFiles(void) 
     823   { 
     824     // If primary server 
     825     if (hasServer && hasClient) 
     826     { 
     827       // (1) Find all enabled files in write mode 
     828       for (int i = 0; i < this->enabledFiles.size(); ++i) 
     829       { 
     830         if (enabledFiles[i]->mode.isEmpty() || (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write )) 
     831          enabledWriteModeFiles.push_back(enabledFiles[i]); 
     832       } 
     833 
     834       // (2) Estimate the data volume for each file 
     835       int size = this->enabledWriteModeFiles.size(); 
     836       std::vector<std::pair<StdSize, CFile*> > dataSizeMap; 
     837       for (size_t i = 0; i < size; ++i) 
     838       { 
     839         CFile* file = this->enabledWriteModeFiles[i]; 
     840         StdSize dataSize; 
     841         std::vector<CField*> enabledFields = file->getEnabledFields(); 
     842         size_t numEnabledFields = enabledFields.size(); 
     843         for (size_t j = 0; j < numEnabledFields; ++j) 
     844         { 
     845           const std::vector<std::map<int, StdSize> > mapSize = enabledFields[j]->getGridDataBufferSize(); 
     846           for (size_t c = 0; c < mapSize.size(); ++c) 
     847           { 
     848             std::map<int, StdSize>::const_iterator it = mapSize[c].begin(), itE = mapSize[c].end(); 
     849             for (; it != itE; ++it) 
     850             { 
     851               dataSize += it->second; 
     852             } 
     853           } 
     854         } 
     855         CDuration outFreq = file->output_freq.getValue(); 
     856         if (outFreq.timestep != 0.0) 
     857         { 
     858           outFreq = calendar->getTimeStep(); 
     859         } 
     860         double outFreqSec = outFreq.second + 60.*(outFreq.minute + 60.*(outFreq.hour + 24.*(outFreq.day + outFreq.year*365.25) ) ); 
     861         dataSize /= outFreqSec; 
     862         dataSizeMap.push_back(make_pair(dataSize,file)); 
     863       } 
     864 
     865       // (3) Sort enabledWriteModeFiles 
     866       std::sort(dataSizeMap.begin(), dataSizeMap.end()); 
     867       for (int i = 0; i < size; ++i) 
     868       { 
     869         enabledWriteModeFiles[i] = dataSizeMap[i].second; 
     870       } 
     871 
     872       // (4) Assign contextClient to each enabled file 
     873       int i,j; 
     874       for (i = 0, j=0; i < enabledFiles.size(); ++i) 
     875       { 
     876         if (enabledFiles[i]->mode.isEmpty() || (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write )) 
     877         { 
     878           int n = j / clientPrimServer.size(); 
     879           int mod = j % clientPrimServer.size(); 
     880           int poolId; 
     881           if (n % 2 == 0) 
     882             poolId =mod; 
     883           else 
     884             poolId = clientPrimServer.size()-1-mod; 
     885            enabledWriteModeFiles[j]->setContextClient(clientPrimServer[poolId]); 
     886           ++j; 
     887         } 
     888         else 
     889         { 
     890           enabledFiles[i]->setContextClient(client); 
     891         } 
     892       } 
     893     } 
     894     else 
     895     { 
     896       for (int i = 0; i < this->enabledFiles.size(); ++i) 
     897         enabledFiles[i]->setContextClient(client); 
     898     } 
    831899   } 
    832900 
  • XIOS/dev/dev_olga/src/node/context.hpp

    r1194 r1208  
    136136         void setClientServerBuffer(CContextClient* contextClient); 
    137137 
     138         // Estimate data size for each enabled file in write mode 
     139         void distributeFiles(void); 
     140 
    138141         // Send context close definition 
    139142         void sendCloseDefinition(void); 
     
    223226         // List of all enabled files in read mode (files on which fields are read) 
    224227         std::vector<CFile*> enabledReadModeFiles; 
     228         // List of all enabled files in write mode 
     229         std::vector<CFile*> enabledWriteModeFiles; 
    225230 
    226231         // List of all enabled fields whose instant data is accessible from the public API 
  • XIOS/dev/dev_olga/src/server.cpp

    r1201 r1208  
    100100        for (i=0; i<srvRanks.size(); i++) 
    101101        { 
    102           if (i >= srvRanks.size()*CXios::ratioServer2/100) 
     102          if (i > srvRanks.size()*(100-CXios::ratioServer2)/100) 
    103103          { 
    104104            sndServerGlobalRanks.push_back(srvRanks[i]); 
Note: See TracChangeset for help on using the changeset viewer.