Ignore:
Timestamp:
11/29/17 18:44:34 (6 years ago)
Author:
ymipsl
Message:

New method to distribute file on server 2 : memory consumption of grids is now taking into account.
This new method can be activated using a specific variable from xios context :
<variable id="server2_dist_file_memory" type="bool">true_or_false</variable>

YM

Location:
XIOS/dev/XIOS_DEV_CMIP6/src
Files:
2 added
2 edited

Legend:

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

    r1330 r1349  
    1717#include "memtrack.hpp" 
    1818#include <limits> 
     19#include <fstream> 
    1920#include "server.hpp" 
     21#include "distribute_file_server2.hpp" 
    2022 
    2123namespace xios { 
     
    889891   void CContext::distributeFiles(void) 
    890892   { 
     893     bool distFileMemory=false ; 
     894     distFileMemory=CXios::getin<bool>("server2_dist_file_memory", distFileMemory); 
     895 
     896     if (distFileMemory) distributeFileOverMemoryBandwith() ; 
     897     else distributeFileOverBandwith() ; 
     898   } 
     899 
     900 
     901   void CContext::distributeFileOverBandwith(void) 
     902   { 
    891903     double eps=std::numeric_limits<double>::epsilon()*10 ; 
    892904      
     
    894906     if (hasServer && hasClient) 
    895907     { 
     908       std::ofstream ofs(("distribute_file_"+getId()+".dat").c_str(), std::ofstream::out); 
    896909       int nbPools = clientPrimServer.size(); 
    897910 
     
    908921       double dataPerPool = 0; 
    909922       int nfield=0 ; 
     923       ofs<<size<<endl ; 
    910924       for (size_t i = 0; i < size; ++i) 
    911925       { 
    912926         CFile* file = this->enabledWriteModeFiles[i]; 
     927         ofs<<file->getId()<<endl ; 
    913928         StdSize dataSize=0; 
    914929         std::vector<CField*> enabledFields = file->getEnabledFields(); 
    915930         size_t numEnabledFields = enabledFields.size(); 
    916          for (size_t j = 0; j < numEnabledFields; ++j) dataSize += enabledFields[j]->getGlobalWrittenSize() ; 
    917  
     931         ofs<<numEnabledFields<<endl ; 
     932         for (size_t j = 0; j < numEnabledFields; ++j) 
     933         { 
     934           dataSize += enabledFields[j]->getGlobalWrittenSize() ; 
     935           ofs<<enabledFields[j]->grid->getId()<<endl ; 
     936           ofs<<enabledFields[j]->getGlobalWrittenSize()<<endl ; 
     937         } 
    918938         double outFreqSec = (Time)(calendar->getCurrentDate()+file->output_freq)-(Time)(calendar->getCurrentDate()) ; 
    919939         double dataSizeSec= dataSize/ outFreqSec; 
     940         ofs<<dataSizeSec<<endl ; 
    920941         nfield++ ; 
    921942// add epsilon*nField to dataSizeSec in order to  preserve reproductive ordering when sorting 
     
    958979     } 
    959980   } 
     981 
     982   void CContext::distributeFileOverMemoryBandwith(void) 
     983   { 
     984     // If primary server 
     985     if (hasServer && hasClient) 
     986     { 
     987       int nbPools = clientPrimServer.size(); 
     988       double ratio=0.5 ; 
     989       ratio=CXios::getin<double>("server2_dist_file_memory_ratio", ratio); 
     990 
     991       int nFiles = this->enabledWriteModeFiles.size(); 
     992       vector<SDistFile> files(nFiles); 
     993       vector<SDistGrid> grids; 
     994       map<string,int> gridMap ; 
     995       string gridId;  
     996       int gridIndex=0 ; 
     997 
     998       for (size_t i = 0; i < nFiles; ++i) 
     999       { 
     1000         StdSize dataSize=0; 
     1001         CFile* file = this->enabledWriteModeFiles[i]; 
     1002         std::vector<CField*> enabledFields = file->getEnabledFields(); 
     1003         size_t numEnabledFields = enabledFields.size(); 
     1004 
     1005         files[i].id_=file->getId() ; 
     1006         files[i].nbGrids_=numEnabledFields; 
     1007         files[i].assignedGrid_ = new int[files[i].nbGrids_] ; 
     1008          
     1009         for (size_t j = 0; j < numEnabledFields; ++j) 
     1010         { 
     1011           gridId=enabledFields[j]->grid->getId() ; 
     1012           if (gridMap.find(gridId)==gridMap.end()) 
     1013           { 
     1014              gridMap[gridId]=gridIndex  ; 
     1015              SDistGrid newGrid;  
     1016              grids.push_back(newGrid) ; 
     1017              gridIndex++ ; 
     1018           } 
     1019           files[i].assignedGrid_[j]=gridMap[gridId] ; 
     1020           grids[files[i].assignedGrid_[j]].size_=enabledFields[j]->getGlobalWrittenSize() ; 
     1021           dataSize += enabledFields[j]->getGlobalWrittenSize() ; // usefull 
     1022         } 
     1023         double outFreqSec = (Time)(calendar->getCurrentDate()+file->output_freq)-(Time)(calendar->getCurrentDate()) ; 
     1024         files[i].bandwith_= dataSize/ outFreqSec ; 
     1025       } 
     1026 
     1027       double bandwith=0 ; 
     1028       double memory=0 ; 
     1029    
     1030       for(int i=0; i<nFiles; i++)  bandwith+=files[i].bandwith_ ; 
     1031       for(int i=0; i<nFiles; i++)  files[i].bandwith_ = files[i].bandwith_/bandwith * ratio ; 
     1032 
     1033       for(int i=0; i<grids.size(); i++)  memory+=grids[i].size_ ; 
     1034       for(int i=0; i<grids.size(); i++)  grids[i].size_ = grids[i].size_ / memory * (1.0-ratio) ; 
     1035        
     1036       distributeFileOverServer2(nbPools, grids.size(), &grids[0], nFiles, &files[0]) ; 
     1037 
     1038       vector<double> memorySize(nbPools,0.) ; 
     1039       vector< set<int> > serverGrids(nbPools) ; 
     1040       vector<double> bandwithSize(nbPools,0.) ; 
     1041        
     1042       for (size_t i = 0; i < nFiles; ++i) 
     1043       { 
     1044         bandwithSize[files[i].assignedServer_] += files[i].bandwith_* bandwith /ratio ; 
     1045         for(int j=0 ; j<files[i].nbGrids_;j++) 
     1046         { 
     1047           if (serverGrids[files[i].assignedServer_].find(files[i].assignedGrid_[j]) == serverGrids[files[i].assignedServer_].end()) 
     1048           { 
     1049             memorySize[files[i].assignedServer_]+= grids[files[i].assignedGrid_[j]].size_ * memory / (1.0-ratio); 
     1050             serverGrids[files[i].assignedServer_].insert(files[i].assignedGrid_[j]) ; 
     1051           } 
     1052         } 
     1053         enabledWriteModeFiles[i]->setContextClient(clientPrimServer[files[i].assignedServer_]) ; 
     1054         delete [] files[i].assignedGrid_ ; 
     1055       } 
     1056 
     1057       for (int i = 0; i < nbPools; ++i) info(100)<<"Pool server level2 "<<i<<"   assigned file bandwith "<<bandwithSize[i]*86400.*4./1024/1024.<<" Mb / days"<<endl ; 
     1058       for (int i = 0; i < nbPools; ++i) info(100)<<"Pool server level2 "<<i<<"   assigned grid memory "<<memorySize[i]*100/1024./1024.<<" Mb"<<endl ; 
     1059 
     1060 
     1061       for (int i = 0; i < this->enabledReadModeFiles.size(); ++i) 
     1062       { 
     1063         enabledReadModeFiles[i]->setContextClient(client);           
     1064       } 
     1065 
     1066   } 
     1067   else 
     1068   { 
     1069     for (int i = 0; i < this->enabledFiles.size(); ++i) 
     1070        enabledFiles[i]->setContextClient(client); 
     1071   } 
     1072} 
     1073 
     1074 
    9601075 
    9611076   /*! 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp

    r1330 r1349  
    140140         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux 
    141141         void distributeFiles(void); 
     142         void distributeFileOverBandwith() ; 
     143         void distributeFileOverMemoryBandwith() ; 
     144          
    142145 
    143146         // Send context close definition 
Note: See TracChangeset for help on using the changeset viewer.