adding commandline flag
[charm.git] / src / ck-ldb / LBDatabase.h
1 /**
2  * \addtogroup CkLdb
3 */
4 /*@{*/
5
6 #ifndef LBDATABASE_H
7 #define LBDATABASE_H
8
9
10 //#include <charm++.h>
11 //#include "ckreduction.h" 
12 #include "lbdb.h"
13 #include "LBDBManager.h"
14 #include "lbdb++.h"
15
16 #define LB_FORMAT_VERSION     2
17
18 class MetaBalancer;
19 extern int _lb_version;
20
21 // command line options
22 class CkLBArgs
23 {
24 private:
25   double _autoLbPeriod;         // in seconds
26   double _lb_alpha;             // per message send overhead
27   double _lb_beeta;             // per byte send overhead
28   int _lb_debug;                // 1 or greater
29   int _lb_printsumamry;         // print summary
30   int _lb_loop;                 // use multiple load balancers in loop
31   int _lb_ignoreBgLoad;
32   int _lb_migObjOnly;           // only consider migratable objs
33   int _lb_syncResume;
34   int _lb_samePeSpeed;          // ignore cpu speed
35   int _lb_testPeSpeed;          // test cpu speed
36   int _lb_useCpuTime;           // use cpu instead of wallclock time
37   int _lb_statson;              // stats collection
38   int _lb_traceComm;            // stats collection for comm
39   int _lb_central_pe;           // processor number for centralized startegy
40   int _lb_percentMovesAllowed; //Specifies restriction on num of chares to be moved(as a percentage of total number of chares). Used by RefineKLB
41   int _lb_teamSize;             // specifies the team size for TeamLB
42   int _lb_metaLbOn;
43 public:
44   CkLBArgs() {
45 #if CMK_BIGSIM_CHARM
46     _autoLbPeriod = 0.02;       // bigsim needs it to be faster (lb may hang)
47 #else
48     _autoLbPeriod = 0.5;        // 0.5 second default
49 #endif
50     _lb_debug = _lb_ignoreBgLoad = _lb_syncResume = _lb_useCpuTime = 0;
51     _lb_printsumamry = _lb_migObjOnly = 0;
52     _lb_statson = _lb_traceComm = 1;
53     _lb_percentMovesAllowed=100;
54     _lb_loop = 0;
55     _lb_central_pe = 0;
56     _lb_teamSize = 1;
57     _lb_metaLbOn = 0;
58   }
59   inline double & lbperiod() { return _autoLbPeriod; }
60   inline int & debug() { return _lb_debug; }
61   inline int & teamSize() {return _lb_teamSize; }
62   inline int & printSummary() { return _lb_printsumamry; }
63   inline int & lbversion() { return _lb_version; }
64   inline int & loop() { return _lb_loop; }
65   inline int & ignoreBgLoad() { return _lb_ignoreBgLoad; }
66   inline int & migObjOnly() { return _lb_migObjOnly; }
67   inline int & syncResume() { return _lb_syncResume; }
68   inline int & samePeSpeed() { return _lb_samePeSpeed; }
69   inline int & testPeSpeed() { return _lb_testPeSpeed; }
70   inline int & useCpuTime() { return _lb_useCpuTime; }
71   inline int & statsOn() { return _lb_statson; }
72   inline int & traceComm() { return _lb_traceComm; }
73   inline int & central_pe() { return _lb_central_pe; }
74   inline double & alpha() { return _lb_alpha; }
75   inline double & beeta() { return _lb_beeta; }
76   inline int & percentMovesAllowed() { return _lb_percentMovesAllowed;}
77   inline int & metaLbOn() {return _lb_metaLbOn;}
78 };
79
80 extern CkLBArgs _lb_args;
81
82 extern int _lb_predict;
83 extern int _lb_predict_delay;
84 extern int _lb_predict_window;
85 #ifndef PREDICT_DEBUG
86 #define PREDICT_DEBUG  0   // 0 = No debug, 1 = Debug info on
87 #endif
88 #define PredictorPrintf  if (PREDICT_DEBUG) CmiPrintf
89
90 // used in constructor of all load balancers
91 class CkLBOptions
92 {
93 private:
94   int seqno;            // for centralized lb, the seqno
95 public:
96   CkLBOptions(): seqno(-1) {}
97   CkLBOptions(int s): seqno(s) {}
98   int getSeqNo() const { return seqno; }
99 };
100 PUPbytes(CkLBOptions)
101                                                                                 
102 #include "LBDatabase.decl.h"
103
104 extern CkGroupID _lbdb;
105
106 class LBDB;
107
108 CkpvExtern(int, numLoadBalancers);
109 CkpvExtern(int, hasNullLB);
110 CkpvExtern(int, lbdatabaseInited);
111
112 // LB options, mostly controled by user parameter
113 extern "C" char * _lbtopo;
114
115 typedef void (*LBCreateFn)();
116 typedef BaseLB * (*LBAllocFn)();
117 void LBDefaultCreate(LBCreateFn f);
118
119 void LBRegisterBalancer(const char *, LBCreateFn, LBAllocFn, const char *, int shown=1);
120
121 void _LBDBInit();
122
123 // main chare
124 class LBDBInit : public Chare {
125   public:
126     LBDBInit(CkArgMsg*);
127     LBDBInit(CkMigrateMessage *m):Chare(m) {}
128 };
129
130 // class which implement a virtual function for the FuturePredictor
131 class LBPredictorFunction {
132 public:
133   virtual ~LBPredictorFunction() {}
134   int num_params;
135
136   virtual void initialize_params(double *x) {double normall=1.0/pow((double)2,(double)31); for (int i=0; i<num_params; ++i) x[i]=rand()*normall;}
137
138   virtual double predict(double x, double *params) =0;
139   virtual void print(double *params) {PredictorPrintf("LB: unknown model\n");};
140   virtual void function(double x, double *param, double &y, double *dyda) =0;
141 };
142
143 // a default implementation for a FuturePredictor function
144 class DefaultFunction : public LBPredictorFunction {
145  public:
146   // constructor
147   DefaultFunction() {num_params=6;};
148
149   // compute the prediction function for the variable x with parameters param
150   double predict(double x, double *param) {return (param[0] + param[1]*x + param[2]*x*x + param[3]*sin(param[4]*(x+param[5])));}
151
152   void print(double *param) {PredictorPrintf("LB: %f + %fx + %fx^2 + %fsin%f(x+%f)\n",param[0],param[1],param[2],param[3],param[4],param[5]);}
153
154   // compute the prediction function and its derivatives respect to the parameters
155   void function(double x, double *param, double &y, double *dyda) {
156     double tmp;
157
158     y = predict(x, param);
159
160     dyda[0] = 1;
161     dyda[1] = x;
162     dyda[2] = x*x;
163     tmp = param[4] * (x+param[5]);
164     dyda[3] = sin(tmp);
165     dyda[4] = param[3] * (x+param[5]) * cos(tmp);
166     dyda[5] = param[3] * param[4] *cos(tmp);
167   }
168 };
169
170
171 class LBDatabase : public CBase_LBDatabase {
172 public:
173   LBDatabase(void)  { init(); }
174   LBDatabase(CkMigrateMessage *m)  { init(); }
175   ~LBDatabase()  { if (avail_vector) delete [] avail_vector; }
176   
177 private:
178   void init();
179 public:
180   inline static LBDatabase * Object() { return CkpvAccess(lbdatabaseInited)?(LBDatabase *)CkLocalBranch(_lbdb):NULL; }
181 #if CMK_LBDB_ON
182   inline LBDB *getLBDB() {return (LBDB*)(myLDHandle.handle);}
183 #endif
184
185   static void initnodeFn(void);
186
187   void pup(PUP::er& p);
188
189   /*
190    * Calls from object managers to load database
191    */
192   inline LDOMHandle RegisterOM(LDOMid userID, void *userptr, LDCallbacks cb) {
193     return LDRegisterOM(myLDHandle,userID, userptr, cb);
194   };
195
196   inline void RegisteringObjects(LDOMHandle _om) {
197     LDRegisteringObjects(_om);
198   };
199
200   inline void DoneRegisteringObjects(LDOMHandle _om) {
201     LDDoneRegisteringObjects(_om);
202   };
203
204   void ResetAdaptive();
205
206   inline LDObjHandle RegisterObj(LDOMHandle h, LDObjid id,
207                           void *userptr,int migratable) {
208     return LDRegisterObj(h,id,userptr,migratable);
209   };
210
211   inline void UnregisterObj(LDObjHandle h) { LDUnregisterObj(h); };
212
213   inline void ObjTime(LDObjHandle h, double walltime, double cputime) {
214     LDObjTime(h,walltime,cputime);
215   };
216
217   inline void GetObjLoad(LDObjHandle &h, LBRealType &walltime, LBRealType &cputime) {
218     LDGetObjLoad(h,&walltime,&cputime);
219   };
220
221   inline void QueryKnownObjLoad(LDObjHandle &h, LBRealType &walltime, LBRealType &cputime) {
222     LDQueryKnownObjLoad(h,&walltime,&cputime);
223   };
224
225   inline int RunningObject(LDObjHandle* _o) const { 
226 #if CMK_LBDB_ON
227       LBDB *const db = (LBDB*)(myLDHandle.handle);
228       if (db->ObjIsRunning()) {
229         *_o = db->RunningObj();
230         return 1;
231       } 
232 #endif
233       return 0;
234       //return LDRunningObject(myLDHandle,_o);
235   };
236   inline const LDObjHandle *RunningObject() const { 
237 #if CMK_LBDB_ON
238       LBDB *const db = (LBDB*)(myLDHandle.handle);
239       if (db->ObjIsRunning()) {
240         return &db->RunningObj();
241       } 
242 #endif
243       return NULL;
244   };
245   inline const LDObjHandle &GetObjHandle(int idx) { return LDGetObjHandle(myLDHandle, idx);}
246   inline void ObjectStart(const LDObjHandle &_h) { LDObjectStart(_h); };
247   inline void ObjectStop(const LDObjHandle &_h) { LDObjectStop(_h); };
248   inline void Send(const LDOMHandle &_om, const LDObjid _id, unsigned int _b, int _p, int force = 0) {
249     LDSend(_om, _id, _b, _p, force);
250   };
251   inline void MulticastSend(const LDOMHandle &_om, LDObjid *_ids, int _n, unsigned int _b, int _nMsgs=1) {
252     LDMulticastSend(_om, _ids, _n, _b, _nMsgs);
253   };
254
255   void EstObjLoad(const LDObjHandle &h, double cpuload);
256   inline void NonMigratable(LDObjHandle h) { LDNonMigratable(h); };
257   inline void Migratable(LDObjHandle h) { LDMigratable(h); };
258   inline void UseAsyncMigrate(LDObjHandle h, CmiBool flag) { LDAsyncMigrate(h, flag); };
259   inline void DumpDatabase(void) { LDDumpDatabase(myLDHandle); };
260
261   /*
262    * Calls from load balancer to load database
263    */  
264   inline void NotifyMigrated(LDMigratedFn fn, void *data) 
265   {
266     LDNotifyMigrated(myLDHandle,fn,data);
267   };
268  
269   inline void AddStartLBFn(LDStartLBFn fn, void *data) 
270   {
271     LDAddStartLBFn(myLDHandle,fn,data);
272   };
273
274   inline void RemoveStartLBFn(LDStartLBFn fn) 
275   {
276     LDRemoveStartLBFn(myLDHandle,fn);
277   };
278
279   inline void StartLB() { LDStartLB(myLDHandle); }
280
281   inline void AddMigrationDoneFn(LDMigrationDoneFn fn, void *data) 
282   {
283     LDAddMigrationDoneFn(myLDHandle,fn,data);
284   };
285
286   inline void RemoveMigrationDoneFn(LDMigrationDoneFn fn) 
287   {
288     LDRemoveMigrationDoneFn(myLDHandle,fn);
289   };
290
291   inline void MigrationDone() { LDMigrationDone(myLDHandle); }
292
293 public:
294   inline void TurnManualLBOn() { LDTurnManualLBOn(myLDHandle); }
295   inline void TurnManualLBOff() { LDTurnManualLBOff(myLDHandle); }
296  
297   inline void PredictorOn(LBPredictorFunction *model) { LDTurnPredictorOn(myLDHandle,model); }
298   inline void PredictorOn(LBPredictorFunction *model,int wind) { LDTurnPredictorOnWin(myLDHandle,model,wind); }
299   inline void PredictorOff() { LDTurnPredictorOff(myLDHandle); }
300   inline void ChangePredictor(LBPredictorFunction *model) { LDTurnPredictorOn(myLDHandle,model); }
301
302   inline void CollectStatsOn(void) { LDCollectStatsOn(myLDHandle); };
303   inline void CollectStatsOff(void) { LDCollectStatsOff(myLDHandle); };
304   inline int  CollectingStats(void) { return LDCollectingStats(myLDHandle); };
305   inline int  CollectingCommStats(void) { return LDCollectingStats(myLDHandle) && _lb_args.traceComm(); };
306   inline void QueryEstLoad(void) { LDQueryEstLoad(myLDHandle); };
307
308   inline int GetObjDataSz(void) { return LDGetObjDataSz(myLDHandle); };
309   inline void GetObjData(LDObjData *data) { LDGetObjData(myLDHandle,data); };
310   inline int GetCommDataSz(void) { return LDGetCommDataSz(myLDHandle); };
311   inline void GetCommData(LDCommData *data) { LDGetCommData(myLDHandle,data); };
312
313   inline void BackgroundLoad(LBRealType *walltime, LBRealType *cputime) {
314     LDBackgroundLoad(myLDHandle,walltime,cputime);
315   }
316
317   inline void IdleTime(LBRealType *walltime) {
318     LDIdleTime(myLDHandle,walltime);
319   };
320
321   inline void TotalTime(LBRealType *walltime, LBRealType *cputime) {
322     LDTotalTime(myLDHandle,walltime,cputime);
323   }
324
325   inline void GetTime(LBRealType *total_walltime,LBRealType *total_cputime,
326                    LBRealType *idletime, LBRealType *bg_walltime, LBRealType *bg_cputime) {
327     LDGetTime(myLDHandle, total_walltime, total_cputime, idletime, bg_walltime, bg_cputime);
328   }
329
330   inline void ClearLoads(void) { LDClearLoads(myLDHandle); };
331   inline int Migrate(LDObjHandle h, int dest) { return LDMigrate(h,dest); };
332
333   inline void Migrated(LDObjHandle h, int waitBarrier=1) {
334     LDMigrated(h, waitBarrier);
335   };
336
337   inline LDBarrierClient AddLocalBarrierClient(LDResumeFn fn, void* data) {
338     return LDAddLocalBarrierClient(myLDHandle,fn,data);
339   };
340
341   inline void RemoveLocalBarrierClient(LDBarrierClient h) {
342     LDRemoveLocalBarrierClient(myLDHandle, h);
343   };
344
345   inline LDBarrierReceiver AddLocalBarrierReceiver(LDBarrierFn fn, void *data) {
346     return LDAddLocalBarrierReceiver(myLDHandle,fn,data);
347   };
348
349   inline void RemoveLocalBarrierReceiver(LDBarrierReceiver h) {
350     LDRemoveLocalBarrierReceiver(myLDHandle,h);
351   };
352
353   inline void AtLocalBarrier(LDBarrierClient h) {
354     LDAtLocalBarrier(myLDHandle,h);
355   }
356   inline void LocalBarrierOn(void) { LDLocalBarrierOn(myLDHandle); };
357   inline void LocalBarrierOff(void) { LDLocalBarrierOn(myLDHandle); };
358   void ResumeClients();
359   inline int ProcessorSpeed() { return LDProcessorSpeed(); };
360   inline void SetLBPeriod(double s) { LDSetLBPeriod(myLDHandle, s);}
361   inline double GetLBPeriod() { return LDGetLBPeriod(myLDHandle);}
362
363   inline void AdaptResumeSync(int lb_period) {
364     LDOMAdaptResumeSync(myLDHandle, lb_period);
365   }
366   void SetMigrationCost(double cost);
367   void SetStrategyCost(double cost);
368
369 private:
370   int mystep;
371   LDHandle myLDHandle;
372   static char *avail_vector;    // processor bit vector
373   int new_ld_balancer;          // for Node 0
374   CkVec<BaseLB *>   loadbalancers;
375   int nloadbalancers;
376   MetaBalancer* metabalancer;
377
378 public:
379   BaseLB** getLoadBalancers() {return loadbalancers.getVec();}
380   int getNLoadBalancers() {return nloadbalancers;}
381
382 public:
383   static int manualOn;
384
385 public:
386   char *availVector() { return avail_vector; }
387   void get_avail_vector(char * bitmap);
388   void set_avail_vector(char * bitmap, int new_ld=-1);
389   int & new_lbbalancer() { return new_ld_balancer; }
390
391   struct LastLBInfo {
392     LBRealType *expectedLoad;
393     LastLBInfo();
394   };
395   LastLBInfo lastLBInfo;
396   inline LBRealType myExpectedLoad() { return lastLBInfo.expectedLoad[CkMyPe()]; }
397   inline LBRealType* expectedLoad() { return lastLBInfo.expectedLoad; }
398   inline int useMem() { return LDMemusage(myLDHandle); }
399
400   int getLoadbalancerTicket();
401   void addLoadbalancer(BaseLB *lb, int seq);
402   void nextLoadbalancer(int seq);
403   const char *loadbalancer(int seq);
404
405   inline int step() { return mystep; }
406   inline void incStep() { mystep++; }
407 };
408
409 void TurnManualLBOn();
410 void TurnManualLBOff();
411
412 void LBTurnPredictorOn(LBPredictorFunction *model);
413 void LBTurnPredictorOn(LBPredictorFunction *model, int wind);
414 void LBTurnPredictorOff();
415 void LBChangePredictor(LBPredictorFunction *model);
416
417 void LBSetPeriod(double second);
418
419 extern "C" void LBTurnInstrumentOn();
420 extern "C" void LBTurnInstrumentOff();
421 extern "C" void LBTurnCommOn();
422 extern "C" void LBTurnCommOff();
423 void LBClearLoads();
424
425 inline LBDatabase* LBDatabaseObj() { return LBDatabase::Object(); }
426
427 inline void get_avail_vector(char * bitmap) {
428   LBDatabaseObj()->get_avail_vector(bitmap);
429 }
430
431 inline void set_avail_vector(char * bitmap) {
432   LBDatabaseObj()->set_avail_vector(bitmap);
433 }
434
435 //  a helper class to suspend/resume load instrumentation when calling into
436 //  runtime apis
437
438 class SystemLoad
439 {
440   const LDObjHandle *objHandle;
441   LBDatabase *lbdb;
442 public:
443   SystemLoad() {
444     lbdb = LBDatabaseObj();
445     objHandle = lbdb->RunningObject();
446     if (objHandle != NULL) {
447       lbdb->ObjectStop(*objHandle);
448     }
449   }
450   ~SystemLoad() {
451     if (objHandle) lbdb->ObjectStart(*objHandle);
452   }
453 };
454
455 #define CK_RUNTIME_API          SystemLoad load_entry;
456
457 #endif /* LDATABASE_H */
458
459 /*@}*/