source: XIOS/dev/branch_openmp/src/distribute_file_server2.cpp @ 1501

Last change on this file since 1501 was 1460, checked in by yushan, 6 years ago

branch_openmp merged with XIOS_DEV_CMIP6@1459

File size: 5.0 KB
Line 
1#include "distribute_file_server2.hpp"
2#include <fstream>
3#include <vector>
4#include <string>
5#include <map>
6#include <iostream>
7#include <cstdlib>
8#include <cmath>
9
10namespace xios
11{
12
13
14using namespace std ;
15
16
17void distributeFileOverServer2(int nbServers, int nGrids, SDistGrid* grids, int nFiles, SDistFile* files)
18{
19
20  double maxBandwith=0 ;
21  for(int i=0; i<nFiles; i++) if (maxBandwith<files[i].bandwith_) maxBandwith=files[i].bandwith_ ;
22  double maxMemory=0 ;
23  for(int i=0; i<nGrids; i++) if (maxMemory<grids[i].size_) maxMemory=grids[i].size_ ;
24  double T0=maxBandwith+maxMemory ;
25 
26  // initialise
27  vector<SDistServer> servers(nbServers) ;
28  for(int i=0;i<nbServers;++i) servers[i].initialize(i,nGrids, grids, nFiles,files) ;
29 
30  double p ;
31  double Em, energy, newEnergy;
32  double T, deltaE ;
33  vector<int> listFile(nFiles);
34   
35  for(int i=0; i<nFiles; ++i) servers[i%nbServers].addFile(i) ;
36
37// compute energy
38  energy=0;
39  for(int i=0;i<nbServers;++i) if (energy<servers[i].energy_) energy=servers[i].energy_ ;
40
41  int nf1,nf2,si,sj ;
42
43//  T=energy ;
44  T=T0 ;
45  int itMax=10*nFiles*nFiles ;
46
47  srand(314159) ;
48  for(int it=0;it<itMax;++it)
49  { 
50     T=T/(1+10./itMax) ;
51  // metropolis step i->j
52
53    nf1=rand()%nFiles ;
54    si=files[nf1].assignedServer_ ;
55    sj=rand()%nbServers ;
56
57    servers[si].removeFile(nf1) ;
58    servers[sj].addFile(nf1) ;
59
60    newEnergy=0;
61    for(int i=0;i<nbServers;++i) if (newEnergy<servers[i].energy_) newEnergy=servers[i].energy_ ;
62    deltaE=newEnergy-energy ;
63   
64    if (deltaE>0) 
65    {
66      p=rand()*1./RAND_MAX ;
67      if ( p > exp(-deltaE/T)) // don't accept configuration
68      {
69        servers[sj].removeFile(nf1) ;
70        servers[si].addFile(nf1) ;
71      }
72      else energy=newEnergy ;
73    }
74    else energy=newEnergy ;
75
76// metropolis step i<->j
77
78    nf1=rand()%nFiles ;
79    nf2=rand()%nFiles ;
80
81    si=files[nf1].assignedServer_ ;
82    sj=files[nf2].assignedServer_ ;
83   
84    servers[si].removeFile(nf1) ;
85    servers[sj].removeFile(nf2) ;
86    servers[si].addFile(nf2) ;
87    servers[sj].addFile(nf1) ;
88
89    newEnergy=0;
90    for(int i=0;i<nbServers;++i) if (newEnergy<servers[i].energy_) newEnergy=servers[i].energy_  ;
91    deltaE=newEnergy-energy ;
92   
93    if (deltaE>0) 
94    {
95      p=rand()*1./RAND_MAX ;
96      if ( p > exp(-deltaE/T)) // don't accept configuration
97      {
98
99        servers[si].removeFile(nf2) ;
100        servers[sj].removeFile(nf1) ;
101        servers[si].addFile(nf1) ;
102        servers[sj].addFile(nf2) ;
103      }
104      else energy=newEnergy ;
105    }
106    else energy=newEnergy ;
107
108// metropolis switch grid
109    if (it%10==0)
110    {
111      int sum=0 ;
112      while(sum==0)
113      {
114        si=rand()%nbServers ;
115        for(int i=0;i<nGrids;++i) sum+=servers[si].assignedGrid_[i] ;
116      }   
117      sj=rand()%nbServers ;
118      int numGrid=rand()%nGrids ;
119      while (servers[si].assignedGrid_[numGrid]==0) numGrid=rand()%nGrids ; 
120     
121      int nListFile=0 ;
122      for(int i=0;i<nFiles; i++)
123      {
124        if (files[i].assignedServer_==si)
125        {
126          for (int j=0;j<files[i].nbGrids_;++j)
127          {
128            if (files[i].assignedGrid_[j]==numGrid)
129            {
130              servers[si].removeFile(i) ;
131              servers[sj].addFile(i) ;
132              listFile[nListFile]=i ;
133              nListFile++ ;
134              break ;
135            }
136          }
137        }
138      }
139
140      newEnergy=0;
141      for(int i=0;i<nbServers;++i) if (newEnergy<servers[i].energy_) newEnergy=servers[i].energy_ ;
142      deltaE=newEnergy-energy ;
143   
144      if (deltaE>0) 
145      {
146        p=rand()*1./RAND_MAX ;
147        if ( p > exp(-deltaE/T)) // don't accept configuration
148        {
149
150          for(int i=0;i<nListFile;++i)
151          {
152            servers[sj].removeFile(listFile[i]) ;
153            servers[si].addFile(listFile[i]) ;
154          }
155        }
156        else energy=newEnergy ;
157      }
158      else energy=newEnergy ;
159    } 
160   
161    if (it%1000==0) cout<<"T "<<T<<"  ;  energy "<<energy<<endl ;
162  }
163}
164
165
166void SDistServer::initialize(int num, int nMaxGrid, SDistGrid* grids, int nMaxFile, SDistFile* files)
167{
168 
169   num_=num ;
170   nMaxGrid_=nMaxGrid;
171   grids_=grids ;
172   nMaxFile=nMaxFile;
173   files_=files ; 
174   energy_=0. ;
175   bandwith_=0.;
176   assignedGrid_=new int[nMaxGrid] ;
177   for(int i=0;i<nMaxGrid;++i) assignedGrid_[i]=0 ;
178}
179
180void SDistServer::finalize()
181{
182  delete [] assignedGrid_ ;
183}
184
185
186
187double SDistServer::addFile(int numFile)
188{
189  int numGrid ;
190  bandwith_+=files_[numFile].bandwith_ ;
191  files_[numFile].assignedServer_=num_ ;
192 
193  for(int i=0;i<files_[numFile].nbGrids_;i++)
194  {
195    numGrid=files_[numFile].assignedGrid_[i] ;
196    if (assignedGrid_[numGrid]==0) memory_+=grids_[numGrid].size_ ;
197    assignedGrid_[numGrid]++ ;
198  }
199  energy_=bandwith_+memory_ ; 
200  return energy_ ;
201}
202
203
204double SDistServer::removeFile(int numFile)
205{
206  int numGrid ;
207  bandwith_-=files_[numFile].bandwith_ ;
208  for(int i=0;i<files_[numFile].nbGrids_;i++)
209  {
210    numGrid=files_[numFile].assignedGrid_[i] ;
211    if (assignedGrid_[numGrid]==1) memory_-=grids_[numGrid].size_ ;
212    assignedGrid_[numGrid]-- ;
213  }
214  energy_=bandwith_+memory_ ; 
215  return energy_ ;
216}
217
218}
Note: See TracBrowser for help on using the repository browser.