00001
00005
00006 #ifndef LBDATABASE_H
00007 #define LBDATABASE_H
00008
00009 #include "lbdb.h"
00010 #include "LBDBManager.h"
00011 #include "lbdb++.h"
00012
00013 #define LB_FORMAT_VERSION 2
00014
00015 extern int _lb_version;
00016
00017
00018 class CkLBArgs
00019 {
00020 private:
00021 double _autoLbPeriod;
00022 double _lb_alpha;
00023 double _lb_beeta;
00024 int _lb_debug;
00025 int _lb_printsumamry;
00026 int _lb_loop;
00027 int _lb_ignoreBgLoad;
00028 int _lb_migObjOnly;
00029 int _lb_syncResume;
00030 int _lb_samePeSpeed;
00031 int _lb_testPeSpeed;
00032 int _lb_useCpuTime;
00033 int _lb_statson;
00034 int _lb_traceComm;
00035 int _lb_central_pe;
00036 int _lb_percentMovesAllowed;
00037 int _lb_teamSize;
00038 public:
00039 CkLBArgs() {
00040 #if CMK_BIGSIM_CHARM
00041 _autoLbPeriod = 0.02;
00042 #else
00043 _autoLbPeriod = 0.5;
00044 #endif
00045 _lb_debug = _lb_ignoreBgLoad = _lb_syncResume = _lb_useCpuTime = 0;
00046 _lb_printsumamry = _lb_migObjOnly = 0;
00047 _lb_statson = _lb_traceComm = 1;
00048 _lb_percentMovesAllowed=100;
00049 _lb_loop = 0;
00050 _lb_central_pe = 0;
00051 _lb_teamSize = 1;
00052 }
00053 inline double & lbperiod() { return _autoLbPeriod; }
00054 inline int & debug() { return _lb_debug; }
00055 inline int & teamSize() {return _lb_teamSize; }
00056 inline int & printSummary() { return _lb_printsumamry; }
00057 inline int & lbversion() { return _lb_version; }
00058 inline int & loop() { return _lb_loop; }
00059 inline int & ignoreBgLoad() { return _lb_ignoreBgLoad; }
00060 inline int & migObjOnly() { return _lb_migObjOnly; }
00061 inline int & syncResume() { return _lb_syncResume; }
00062 inline int & samePeSpeed() { return _lb_samePeSpeed; }
00063 inline int & testPeSpeed() { return _lb_testPeSpeed; }
00064 inline int & useCpuTime() { return _lb_useCpuTime; }
00065 inline int & statsOn() { return _lb_statson; }
00066 inline int & traceComm() { return _lb_traceComm; }
00067 inline int & central_pe() { return _lb_central_pe; }
00068 inline double & alpha() { return _lb_alpha; }
00069 inline double & beeta() { return _lb_beeta; }
00070 inline int & percentMovesAllowed() { return _lb_percentMovesAllowed;}
00071 };
00072
00073 extern CkLBArgs _lb_args;
00074
00075 extern int _lb_predict;
00076 extern int _lb_predict_delay;
00077 extern int _lb_predict_window;
00078 #ifndef PREDICT_DEBUG
00079 #define PREDICT_DEBUG 0 // 0 = No debug, 1 = Debug info on
00080 #endif
00081 #define PredictorPrintf if (PREDICT_DEBUG) CmiPrintf
00082
00083
00084 class CkLBOptions
00085 {
00086 private:
00087 int seqno;
00088 public:
00089 CkLBOptions(): seqno(-1) {}
00090 CkLBOptions(int s): seqno(s) {}
00091 int getSeqNo() const { return seqno; }
00092 };
00093 PUPbytes(CkLBOptions)
00094
00095 #include "LBDatabase.decl.h"
00096
00097 extern CkGroupID _lbdb;
00098
00099 class LBDB;
00100
00101 CkpvExtern(int, numLoadBalancers);
00102 CkpvExtern(int, hasNullLB);
00103 CkpvExtern(int, lbdatabaseInited);
00104
00105
00106 extern "C" char * _lbtopo;
00107
00108 typedef void (*LBCreateFn)();
00109 typedef BaseLB * (*LBAllocFn)();
00110 void LBDefaultCreate(LBCreateFn f);
00111
00112 void LBRegisterBalancer(const char *, LBCreateFn, LBAllocFn, const char *, int shown=1);
00113
00114 void _LBDBInit();
00115
00116
00117 class LBDBInit : public Chare {
00118 public:
00119 LBDBInit(CkArgMsg*);
00120 LBDBInit(CkMigrateMessage *m):Chare(m) {}
00121 };
00122
00123
00124 class LBPredictorFunction {
00125 public:
00126 virtual ~LBPredictorFunction() {}
00127 int num_params;
00128
00129 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;}
00130
00131 virtual double predict(double x, double *params) =0;
00132 virtual void print(double *params) {PredictorPrintf("LB: unknown model\n");};
00133 virtual void function(double x, double *param, double &y, double *dyda) =0;
00134 };
00135
00136
00137 class DefaultFunction : public LBPredictorFunction {
00138 public:
00139
00140 DefaultFunction() {num_params=6;};
00141
00142
00143 double predict(double x, double *param) {return (param[0] + param[1]*x + param[2]*x*x + param[3]*sin(param[4]*(x+param[5])));}
00144
00145 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]);}
00146
00147
00148 void function(double x, double *param, double &y, double *dyda) {
00149 double tmp;
00150
00151 y = predict(x, param);
00152
00153 dyda[0] = 1;
00154 dyda[1] = x;
00155 dyda[2] = x*x;
00156 tmp = param[4] * (x+param[5]);
00157 dyda[3] = sin(tmp);
00158 dyda[4] = param[3] * (x+param[5]) * cos(tmp);
00159 dyda[5] = param[3] * param[4] *cos(tmp);
00160 }
00161 };
00162
00163
00164 class LBDatabase : public IrrGroup {
00165 public:
00166 LBDatabase(void) { init(); }
00167 LBDatabase(CkMigrateMessage *m) { init(); }
00168 ~LBDatabase() { if (avail_vector) delete [] avail_vector; }
00169
00170 private:
00171 void init();
00172 public:
00173 inline static LBDatabase * Object() { return CkpvAccess(lbdatabaseInited)?(LBDatabase *)CkLocalBranch(_lbdb):NULL; }
00174 #if CMK_LBDB_ON
00175 inline LBDB *getLBDB() {return (LBDB*)(myLDHandle.handle);}
00176 #endif
00177
00178 static void initnodeFn(void);
00179
00180 void pup(PUP::er& p);
00181
00182
00183
00184
00185 inline LDOMHandle RegisterOM(LDOMid userID, void *userptr, LDCallbacks cb) {
00186 return LDRegisterOM(myLDHandle,userID, userptr, cb);
00187 };
00188
00189 inline void RegisteringObjects(LDOMHandle _om) {
00190 LDRegisteringObjects(_om);
00191 };
00192
00193 inline void DoneRegisteringObjects(LDOMHandle _om) {
00194 LDDoneRegisteringObjects(_om);
00195 };
00196
00197 inline LDObjHandle RegisterObj(LDOMHandle h, LDObjid id,
00198 void *userptr,int migratable) {
00199 return LDRegisterObj(h,id,userptr,migratable);
00200 };
00201
00202 inline void UnregisterObj(LDObjHandle h) { LDUnregisterObj(h); };
00203
00204 inline void ObjTime(LDObjHandle h, double walltime, double cputime) {
00205 LDObjTime(h,walltime,cputime);
00206 };
00207
00208 inline void GetObjLoad(LDObjHandle &h, LBRealType &walltime, LBRealType &cputime) {
00209 LDGetObjLoad(h,&walltime,&cputime);
00210 };
00211
00212 inline void QueryKnownObjLoad(LDObjHandle &h, LBRealType &walltime, LBRealType &cputime) {
00213 LDQueryKnownObjLoad(h,&walltime,&cputime);
00214 };
00215
00216 inline int RunningObject(LDObjHandle* _o) const {
00217 #if CMK_LBDB_ON
00218 LBDB *const db = (LBDB*)(myLDHandle.handle);
00219 if (db->ObjIsRunning()) {
00220 *_o = db->RunningObj();
00221 return 1;
00222 }
00223 #endif
00224 return 0;
00225
00226 };
00227 inline const LDObjHandle *RunningObject() const {
00228 #if CMK_LBDB_ON
00229 LBDB *const db = (LBDB*)(myLDHandle.handle);
00230 if (db->ObjIsRunning()) {
00231 return &db->RunningObj();
00232 }
00233 #endif
00234 return NULL;
00235 };
00236 inline const LDObjHandle &GetObjHandle(int idx) { return LDGetObjHandle(myLDHandle, idx);}
00237 inline void ObjectStart(const LDObjHandle &_h) { LDObjectStart(_h); };
00238 inline void ObjectStop(const LDObjHandle &_h) { LDObjectStop(_h); };
00239 inline void Send(const LDOMHandle &_om, const LDObjid _id, unsigned int _b, int _p, int force = 0) {
00240 LDSend(_om, _id, _b, _p, force);
00241 };
00242 inline void MulticastSend(const LDOMHandle &_om, LDObjid *_ids, int _n, unsigned int _b, int _nMsgs=1) {
00243 LDMulticastSend(_om, _ids, _n, _b, _nMsgs);
00244 };
00245
00246 void EstObjLoad(const LDObjHandle &h, double cpuload);
00247 inline void NonMigratable(LDObjHandle h) { LDNonMigratable(h); };
00248 inline void Migratable(LDObjHandle h) { LDMigratable(h); };
00249 inline void UseAsyncMigrate(LDObjHandle h, CmiBool flag) { LDAsyncMigrate(h, flag); };
00250 inline void DumpDatabase(void) { LDDumpDatabase(myLDHandle); };
00251
00252
00253
00254
00255 inline void NotifyMigrated(LDMigratedFn fn, void *data)
00256 {
00257 LDNotifyMigrated(myLDHandle,fn,data);
00258 };
00259
00260 inline void AddStartLBFn(LDStartLBFn fn, void *data)
00261 {
00262 LDAddStartLBFn(myLDHandle,fn,data);
00263 };
00264
00265 inline void RemoveStartLBFn(LDStartLBFn fn)
00266 {
00267 LDRemoveStartLBFn(myLDHandle,fn);
00268 };
00269
00270 inline void StartLB() { LDStartLB(myLDHandle); }
00271
00272 inline void AddMigrationDoneFn(LDMigrationDoneFn fn, void *data)
00273 {
00274 LDAddMigrationDoneFn(myLDHandle,fn,data);
00275 };
00276
00277 inline void RemoveMigrationDoneFn(LDMigrationDoneFn fn)
00278 {
00279 LDRemoveMigrationDoneFn(myLDHandle,fn);
00280 };
00281
00282 inline void MigrationDone() { LDMigrationDone(myLDHandle); }
00283
00284 public:
00285 inline void TurnManualLBOn() { LDTurnManualLBOn(myLDHandle); }
00286 inline void TurnManualLBOff() { LDTurnManualLBOff(myLDHandle); }
00287
00288 inline void PredictorOn(LBPredictorFunction *model) { LDTurnPredictorOn(myLDHandle,model); }
00289 inline void PredictorOn(LBPredictorFunction *model,int wind) { LDTurnPredictorOnWin(myLDHandle,model,wind); }
00290 inline void PredictorOff() { LDTurnPredictorOff(myLDHandle); }
00291 inline void ChangePredictor(LBPredictorFunction *model) { LDTurnPredictorOn(myLDHandle,model); }
00292
00293 inline void CollectStatsOn(void) { LDCollectStatsOn(myLDHandle); };
00294 inline void CollectStatsOff(void) { LDCollectStatsOff(myLDHandle); };
00295 inline int CollectingStats(void) { return LDCollectingStats(myLDHandle); };
00296 inline int CollectingCommStats(void) { return LDCollectingStats(myLDHandle) && _lb_args.traceComm(); };
00297 inline void QueryEstLoad(void) { LDQueryEstLoad(myLDHandle); };
00298
00299 inline int GetObjDataSz(void) { return LDGetObjDataSz(myLDHandle); };
00300 inline void GetObjData(LDObjData *data) { LDGetObjData(myLDHandle,data); };
00301 inline int GetCommDataSz(void) { return LDGetCommDataSz(myLDHandle); };
00302 inline void GetCommData(LDCommData *data) { LDGetCommData(myLDHandle,data); };
00303
00304 inline void BackgroundLoad(LBRealType *walltime, LBRealType *cputime) {
00305 LDBackgroundLoad(myLDHandle,walltime,cputime);
00306 }
00307
00308 inline void IdleTime(LBRealType *walltime) {
00309 LDIdleTime(myLDHandle,walltime);
00310 };
00311
00312 inline void TotalTime(LBRealType *walltime, LBRealType *cputime) {
00313 LDTotalTime(myLDHandle,walltime,cputime);
00314 }
00315
00316 inline void GetTime(LBRealType *total_walltime,LBRealType *total_cputime,
00317 LBRealType *idletime, LBRealType *bg_walltime, LBRealType *bg_cputime) {
00318 LDGetTime(myLDHandle, total_walltime, total_cputime, idletime, bg_walltime, bg_cputime);
00319 }
00320
00321 inline void ClearLoads(void) { LDClearLoads(myLDHandle); };
00322 inline int Migrate(LDObjHandle h, int dest) { return LDMigrate(h,dest); };
00323
00324 inline void Migrated(LDObjHandle h, int waitBarrier=1) { LDMigrated(h, waitBarrier); };
00325
00326 inline LDBarrierClient AddLocalBarrierClient(LDResumeFn fn, void* data) {
00327 return LDAddLocalBarrierClient(myLDHandle,fn,data);
00328 };
00329
00330 inline void RemoveLocalBarrierClient(LDBarrierClient h) {
00331 LDRemoveLocalBarrierClient(myLDHandle, h);
00332 };
00333
00334 inline LDBarrierReceiver AddLocalBarrierReceiver(LDBarrierFn fn, void *data) {
00335 return LDAddLocalBarrierReceiver(myLDHandle,fn,data);
00336 };
00337
00338 inline void RemoveLocalBarrierReceiver(LDBarrierReceiver h) {
00339 LDRemoveLocalBarrierReceiver(myLDHandle,h);
00340 };
00341
00342 inline void AtLocalBarrier(LDBarrierClient h) { LDAtLocalBarrier(myLDHandle,h); }
00343 inline void LocalBarrierOn(void) { LDLocalBarrierOn(myLDHandle); };
00344 inline void LocalBarrierOff(void) { LDLocalBarrierOn(myLDHandle); };
00345 inline void ResumeClients() { LDResumeClients(myLDHandle); }
00346
00347 inline int ProcessorSpeed() { return LDProcessorSpeed(); };
00348 inline void SetLBPeriod(double s) { LDSetLBPeriod(myLDHandle, s);}
00349 inline double GetLBPeriod() { return LDGetLBPeriod(myLDHandle);}
00350
00351 private:
00352 int mystep;
00353 LDHandle myLDHandle;
00354 static char *avail_vector;
00355 int new_ld_balancer;
00356 CkVec<BaseLB *> loadbalancers;
00357 int nloadbalancers;
00358
00359 public:
00360 BaseLB** getLoadBalancers() {return loadbalancers.getVec();}
00361 int getNLoadBalancers() {return nloadbalancers;}
00362
00363 public:
00364 static int manualOn;
00365
00366 public:
00367 char *availVector() { return avail_vector; }
00368 void get_avail_vector(char * bitmap);
00369 void set_avail_vector(char * bitmap, int new_ld=-1);
00370 int & new_lbbalancer() { return new_ld_balancer; }
00371
00372 struct LastLBInfo {
00373 LBRealType *expectedLoad;
00374 LastLBInfo();
00375 };
00376 LastLBInfo lastLBInfo;
00377 inline LBRealType myExpectedLoad() { return lastLBInfo.expectedLoad[CkMyPe()]; }
00378 inline LBRealType* expectedLoad() { return lastLBInfo.expectedLoad; }
00379 inline int useMem() { return LDMemusage(myLDHandle); }
00380
00381 int getLoadbalancerTicket();
00382 void addLoadbalancer(BaseLB *lb, int seq);
00383 void nextLoadbalancer(int seq);
00384 const char *loadbalancer(int seq);
00385
00386 inline int step() { return mystep; }
00387 inline void incStep() { mystep++; }
00388 };
00389
00390 void TurnManualLBOn();
00391 void TurnManualLBOff();
00392
00393 void LBTurnPredictorOn(LBPredictorFunction *model);
00394 void LBTurnPredictorOn(LBPredictorFunction *model, int wind);
00395 void LBTurnPredictorOff();
00396 void LBChangePredictor(LBPredictorFunction *model);
00397
00398 void LBSetPeriod(double second);
00399
00400 extern "C" void LBTurnInstrumentOn();
00401 extern "C" void LBTurnInstrumentOff();
00402 void LBClearLoads();
00403
00404 inline LBDatabase* LBDatabaseObj() { return LBDatabase::Object(); }
00405
00406 inline void get_avail_vector(char * bitmap) {
00407 LBDatabaseObj()->get_avail_vector(bitmap);
00408 }
00409
00410 inline void set_avail_vector(char * bitmap) {
00411 LBDatabaseObj()->set_avail_vector(bitmap);
00412 }
00413
00414
00415
00416
00417 class SystemLoad
00418 {
00419 const LDObjHandle *objHandle;
00420 LBDatabase *lbdb;
00421 public:
00422 SystemLoad() {
00423 lbdb = LBDatabaseObj();
00424 objHandle = lbdb->RunningObject();
00425 if (objHandle != NULL) {
00426 lbdb->ObjectStop(*objHandle);
00427 }
00428 }
00429 ~SystemLoad() {
00430 if (objHandle) lbdb->ObjectStart(*objHandle);
00431 }
00432 };
00433
00434 #define CK_RUNTIME_API SystemLoad load_entry;
00435
00436 #endif
00437