Changeset 1349 for XIOS/dev/XIOS_DEV_CMIP6/src
- Timestamp:
- 11/29/17 18:44:34 (6 years ago)
- 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 17 17 #include "memtrack.hpp" 18 18 #include <limits> 19 #include <fstream> 19 20 #include "server.hpp" 21 #include "distribute_file_server2.hpp" 20 22 21 23 namespace xios { … … 889 891 void CContext::distributeFiles(void) 890 892 { 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 { 891 903 double eps=std::numeric_limits<double>::epsilon()*10 ; 892 904 … … 894 906 if (hasServer && hasClient) 895 907 { 908 std::ofstream ofs(("distribute_file_"+getId()+".dat").c_str(), std::ofstream::out); 896 909 int nbPools = clientPrimServer.size(); 897 910 … … 908 921 double dataPerPool = 0; 909 922 int nfield=0 ; 923 ofs<<size<<endl ; 910 924 for (size_t i = 0; i < size; ++i) 911 925 { 912 926 CFile* file = this->enabledWriteModeFiles[i]; 927 ofs<<file->getId()<<endl ; 913 928 StdSize dataSize=0; 914 929 std::vector<CField*> enabledFields = file->getEnabledFields(); 915 930 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 } 918 938 double outFreqSec = (Time)(calendar->getCurrentDate()+file->output_freq)-(Time)(calendar->getCurrentDate()) ; 919 939 double dataSizeSec= dataSize/ outFreqSec; 940 ofs<<dataSizeSec<<endl ; 920 941 nfield++ ; 921 942 // add epsilon*nField to dataSizeSec in order to preserve reproductive ordering when sorting … … 958 979 } 959 980 } 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 960 1075 961 1076 /*! -
XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp
r1330 r1349 140 140 // Distribute files (in write mode) among secondary-server pools according to the estimated data flux 141 141 void distributeFiles(void); 142 void distributeFileOverBandwith() ; 143 void distributeFileOverMemoryBandwith() ; 144 142 145 143 146 // Send context close definition
Note: See TracChangeset
for help on using the changeset viewer.