00001
00002
00003
00004
00005
00006
00007
00012
00013 #ifndef LBDBH_H
00014 #define LBDBH_H
00015
00016 #include "converse.h"
00017 #include "charm.h"
00018 #include "middle.h"
00019
00020 extern int _lb_version;
00021
00022 #ifdef __cplusplus
00023 extern "C" {
00024 #endif
00025
00026 typedef void* cvoid;
00027
00028
00029
00030 #define OBJ_ID_SZ 4
00031
00032 #if CMK_LBDB_ON
00033 typedef struct {
00034 void *handle;
00035 } LDHandle;
00036 #else
00037 typedef int LDHandle;
00038 #endif
00039
00040 typedef struct _LDOMid {
00041 CkGroupID id;
00042 #ifdef __cplusplus
00043 CmiBool operator==(const struct _LDOMid& omId) const {
00044 return id == omId.id?CmiTrue:CmiFalse;
00045 }
00046 CmiBool operator!=(const struct _LDOMid& omId) const {
00047 return id == omId.id?CmiFalse:CmiTrue;
00048 }
00049 inline void pup(PUP::er &p);
00050 #endif
00051 } LDOMid;
00052
00053 typedef struct {
00054 LDHandle ldb;
00055
00056 LDOMid id;
00057 int handle;
00058 #ifdef __cplusplus
00059 inline void pup(PUP::er &p);
00060 #endif
00061 } LDOMHandle;
00062
00063 typedef struct _LDObjid {
00064 int id[OBJ_ID_SZ];
00065 #ifdef __cplusplus
00066 CmiBool operator==(const struct _LDObjid& objid) const {
00067 for (int i=0; i<OBJ_ID_SZ; i++) if (id[i] != objid.id[i]) return CmiFalse;
00068 return CmiTrue;
00069 }
00070 inline void pup(PUP::er &p);
00071 #endif
00072 } LDObjid;
00073
00074
00075 typedef struct _LDObjKey {
00076 LDOMid omId;
00077 LDObjid objId;
00078 public:
00079 #ifdef __cplusplus
00080 CmiBool operator==(const _LDObjKey& obj) const {
00081 return (CmiBool)(omId == obj.omId && objId == obj.objId);
00082 }
00083 inline LDOMid &omID() { return omId; }
00084 inline LDObjid &objID() { return objId; }
00085 inline const LDOMid &omID() const { return omId; }
00086 inline const LDObjid &objID() const { return objId; }
00087 inline void pup(PUP::er &p);
00088 #endif
00089 } LDObjKey;
00090
00091 typedef int LDObjIndex;
00092 typedef int LDOMIndex;
00093
00094 typedef struct {
00095 LDOMHandle omhandle;
00096 LDObjid id;
00097 LDObjIndex handle;
00098 #ifdef __cplusplus
00099 inline const LDOMid &omID() const { return omhandle.id; }
00100 inline const LDObjid &objID() const { return id; }
00101 inline void pup(PUP::er &p);
00102 #endif
00103 } LDObjHandle;
00104
00105 typedef struct {
00106 LDObjHandle handle;
00107 double cpuTime;
00108 double wallTime;
00109 double minWall, maxWall;
00110 CmiBool migratable;
00111 CmiBool asyncArrival;
00112 #ifdef __cplusplus
00113 inline const LDOMHandle &omHandle() const { return handle.omhandle; }
00114 inline const LDOMid &omID() const { return handle.omhandle.id; }
00115 inline const LDObjid &objID() const { return handle.id; }
00116 inline const LDObjid &id() const { return handle.id; }
00117 inline void pup(PUP::er &p);
00118 #endif
00119 } LDObjData;
00120
00121
00122 typedef struct {
00123 int index;
00124 LDObjData data;
00125 int from_proc;
00126 int to_proc;
00127 #ifdef __cplusplus
00128 inline void pup(PUP::er &p);
00129 #endif
00130 } LDObjStats;
00131
00132 #define LD_PROC_MSG 1
00133 #define LD_OBJ_MSG 2
00134 #define LD_OBJLIST_MSG 3
00135
00136 typedef struct _LDCommDesc {
00137 char type;
00138 union {
00139 int destProc;
00140 struct{
00141 LDObjKey destObj;
00142 int destObjProc;
00143 } destObj;
00144 struct {
00145 LDObjKey *objs;
00146 int len;
00147 } destObjs;
00148 } dest;
00149 #ifdef __cplusplus
00150 char &get_type() { return type; }
00151 char get_type() const { return type; }
00152 int proc() const { return type==LD_PROC_MSG?dest.destProc:-1; }
00153 void setProc(int pe) { CmiAssert(type==LD_PROC_MSG); dest.destProc = pe; }
00154 int lastKnown() const {
00155 if (type==LD_OBJ_MSG) return dest.destObj.destObjProc;
00156 if (type==LD_PROC_MSG) return dest.destProc;
00157 return -1;
00158 }
00159 LDObjKey &get_destObj()
00160 { CmiAssert(type==LD_OBJ_MSG); return dest.destObj.destObj; }
00161 LDObjKey const &get_destObj() const
00162 { CmiAssert(type==LD_OBJ_MSG); return dest.destObj.destObj; }
00163 LDObjKey * get_destObjs(int &len)
00164 { CmiAssert(type==LD_OBJLIST_MSG); len=dest.destObjs.len; return dest.destObjs.objs; }
00165 void init_objmsg(LDOMid &omid, LDObjid &objid, int destObjProc) {
00166 type=LD_OBJ_MSG;
00167 dest.destObj.destObj.omID()=omid;
00168 dest.destObj.destObj.objID() =objid;
00169 dest.destObj.destObjProc = destObjProc;
00170 }
00171 void init_mcastmsg(LDOMid &omid, LDObjid *objid, int len) {
00172 type=LD_OBJLIST_MSG;
00173 dest.destObjs.len = len;
00174 dest.destObjs.objs = new LDObjKey[len];
00175 for (int i=0; i<len; i++) {
00176 dest.destObjs.objs[i].omID()=omid;
00177 dest.destObjs.objs[i].objID() =objid[i];
00178 }
00179 }
00180 inline CmiBool operator==(const _LDCommDesc &obj) const;
00181 inline _LDCommDesc &operator=(const _LDCommDesc &c);
00182 inline void pup(PUP::er &p);
00183 #endif
00184 } LDCommDesc;
00185
00186 typedef struct {
00187 int src_proc;
00188 LDObjKey sender;
00189 LDCommDesc receiver;
00190 int sendHash, recvHash;
00191 int messages;
00192 int bytes;
00193 #ifdef __cplusplus
00194 inline int from_proc() const { return (src_proc != -1); }
00195 inline int recv_type() const { return receiver.get_type(); }
00196 inline void pup(PUP::er &p);
00197 inline void clearHash() { sendHash = recvHash = -1; }
00198 #endif
00199 } LDCommData;
00200
00201
00202
00203
00204
00205
00206 void LBBalance(void *param);
00207 void LBCollectStatsOn(void);
00208 void LBCollectStatsOff(void);
00209
00210
00211
00212
00213 typedef void (*LDMigrateFn)(LDObjHandle handle, int dest);
00214 typedef void (*LDStatsFn)(LDOMHandle h, int state);
00215 typedef void (*LDQueryEstLoadFn)(LDOMHandle h);
00216
00217 typedef struct {
00218 LDMigrateFn migrate;
00219 LDStatsFn setStats;
00220 LDQueryEstLoadFn queryEstLoad;
00221 } LDCallbacks;
00222
00223
00224
00225
00226 #if CMK_LBDB_ON
00227 LDHandle LDCreate(void);
00228 #else
00229 #define LDCreate() 0
00230 #endif
00231
00232 LDOMHandle LDRegisterOM(LDHandle _lbdb, LDOMid userID,
00233 void *userptr, LDCallbacks cb);
00234 void * LDOMUserData(LDOMHandle &_h);
00235 void LDRegisteringObjects(LDOMHandle _h);
00236 void LDDoneRegisteringObjects(LDOMHandle _h);
00237
00238 LDObjHandle LDRegisterObj(LDOMHandle h, LDObjid id, void *userptr,
00239 int migratable);
00240 void LDUnregisterObj(LDObjHandle h);
00241 const LDObjHandle &LDGetObjHandle(LDHandle h, int idx);
00242
00243 void * LDObjUserData(LDObjHandle &_h);
00244 void LDObjTime(LDObjHandle &h, double walltime, double cputime);
00245 int CLDRunningObject(LDHandle _h, LDObjHandle* _o );
00246 void LDObjectStart(const LDObjHandle &_h);
00247 void LDObjectStop(const LDObjHandle &_h);
00248 void LDSend(const LDOMHandle &destOM, const LDObjid &destid, unsigned int bytes, int destObjProc);
00249 void LDMulticastSend(const LDOMHandle &destOM, LDObjid *destids, int ndests, unsigned int bytes, int nMsgs);
00250
00251 void LDMessage(LDObjHandle from,
00252 LDOMid toOM, LDObjid *toID, int bytes);
00253
00254 void LDEstObjLoad(LDObjHandle h, double load);
00255 void LDNonMigratable(const LDObjHandle &h);
00256 void LDMigratable(const LDObjHandle &h);
00257 void LDAsyncMigrate(const LDObjHandle &h, CmiBool);
00258 void LDDumpDatabase(LDHandle _lbdb);
00259
00260
00261
00262
00263 typedef void (*LDMigratedFn)(void* data, LDObjHandle handle, int waitBarrier);
00264 void LDNotifyMigrated(LDHandle _lbdb, LDMigratedFn fn, void* data);
00265
00266 typedef void (*LDStartLBFn)(void *user_ptr);
00267 void LDAddStartLBFn(LDHandle _lbdb, LDStartLBFn fn, void* data);
00268 void LDRemoveStartLBFn(LDHandle _lbdb, LDStartLBFn fn);
00269 void LDStartLB(LDHandle _db);
00270 void LDTurnManualLBOn(LDHandle _lbdb);
00271 void LDTurnManualLBOff(LDHandle _lbdb);
00272
00273 typedef void (*LDPredictFn)(void* user_ptr);
00274 typedef void (*LDPredictModelFn)(void* user_ptr, void* model);
00275 typedef void (*LDPredictWindowFn)(void* user_ptr, void* model, int wind);
00276 void LDTurnPredictorOn(LDHandle _lbdb, void *model);
00277 void LDTurnPredictorOnWin(LDHandle _lbdb, void *model, int wind);
00278 void LDTurnPredictorOff(LDHandle _lbdb);
00279 void LDChangePredictor(LDHandle _lbdb, void *model);
00280 void LDCollectStatsOn(LDHandle _lbdb);
00281 void LDCollectStatsOff(LDHandle _lbdb);
00282 int CLDCollectingStats(LDHandle _lbdb);
00283 void LDQueryEstLoad(LDHandle bdb);
00284 void LDQueryKnownObjLoad(LDObjHandle &h, double *cpuT, double *wallT);
00285
00286 int LDGetObjDataSz(LDHandle _lbdb);
00287 void LDGetObjData(LDHandle _lbdb, LDObjData *data);
00288
00289 int LDGetCommDataSz(LDHandle _lbdb);
00290 void LDGetCommData(LDHandle _lbdb, LDCommData *data);
00291
00292 void LDBackgroundLoad(LDHandle _lbdb, double *walltime, double *cputime);
00293 void LDIdleTime(LDHandle _lbdb, double *walltime);
00294 void LDTotalTime(LDHandle _lbdb, double *walltime, double *cputime);
00295 void LDGetTime(LDHandle _db, double *total_walltime,double *total_cputime,
00296 double *idletime, double *bg_walltime, double *bg_cputime);
00297
00298 void LDClearLoads(LDHandle _lbdb);
00299 int LDMigrate(LDObjHandle h, int dest);
00300 void LDMigrated(LDObjHandle h, int waitBarrier);
00301
00302
00303
00304
00305 typedef void (*LDBarrierFn)(void *user_ptr);
00306 typedef void (*LDResumeFn)(void *user_ptr);
00307
00308 typedef struct {
00309 int serial;
00310 } LDBarrierClient;
00311
00312 typedef struct {
00313 int serial;
00314 } LDBarrierReceiver;
00315
00316 LDBarrierClient LDAddLocalBarrierClient(LDHandle _lbdb,LDResumeFn fn,
00317 void* data);
00318 void LDRemoveLocalBarrierClient(LDHandle _lbdb, LDBarrierClient h);
00319 LDBarrierReceiver LDAddLocalBarrierReceiver(LDHandle _lbdb,LDBarrierFn fn,
00320 void* data);
00321 void LDRemoveLocalBarrierReceiver(LDHandle _lbdb,LDBarrierReceiver h);
00322 void LDAtLocalBarrier(LDHandle _lbdb, LDBarrierClient h);
00323 void LDLocalBarrierOn(LDHandle _db);
00324 void LDLocalBarrierOff(LDHandle _db);
00325 void LDResumeClients(LDHandle _lbdb);
00326 int LDProcessorSpeed();
00327 CmiBool LDOMidEqual(const LDOMid &i1, const LDOMid &i2);
00328 CmiBool LDObjIDEqual(const LDObjid &i1, const LDObjid &i2);
00329
00330
00331
00332
00333 void LDSetLBPeriod(LDHandle _db, double s);
00334 double LDGetLBPeriod(LDHandle _db);
00335
00336 int LDMemusage(LDHandle _db);
00337
00338 #ifdef __cplusplus
00339 }
00340 #endif
00341
00342 #ifdef __cplusplus
00343
00344 #if CMK_LBDB_ON
00345 PUPbytes(LDHandle)
00346 #endif
00347
00348 inline void LDOMid::pup(PUP::er &p) {
00349 id.pup(p);
00350 }
00351 PUPmarshall(LDOMid);
00352
00353 inline void LDObjid::pup(PUP::er &p) {
00354 for (int i=0; i<OBJ_ID_SZ; i++) p|id[i];
00355 }
00356 PUPmarshall(LDObjid);
00357
00358 inline void LDObjKey::pup(PUP::er &p) {
00359 p|omId;
00360 p|objId;
00361 }
00362 PUPmarshall(LDObjKey);
00363
00364 inline void LDObjStats::pup(PUP::er &p) {
00365 p|index;
00366 p|data;
00367 p|from_proc;
00368 p|to_proc;
00369 }
00370 PUPmarshall(LDObjStats);
00371 inline void LDOMHandle::pup(PUP::er &p) {
00372
00373 int ptrSize = sizeof(void *);
00374 p|ptrSize;
00375
00376
00377 if (p.isUnpacking() && ptrSize != sizeof(void *)) {
00378 char dummy;
00379 for (int i=0; i<ptrSize; i++) p|dummy;
00380 }
00381 else
00382 p|ldb;
00383 p|id;
00384 p|handle;
00385 }
00386 PUPmarshall(LDOMHandle);
00387
00388 inline void LDObjHandle::pup(PUP::er &p) {
00389 p|omhandle;
00390 p|id;
00391 p|handle;
00392 }
00393 PUPmarshall(LDObjHandle);
00394
00395 inline void LDObjData::pup(PUP::er &p) {
00396 p|handle;
00397 p|cpuTime;
00398 p|wallTime;
00399 p|minWall;
00400 p|maxWall;
00401 p|migratable;
00402 if (_lb_version > -1) p|asyncArrival;
00403 }
00404 PUPmarshall(LDObjData);
00405
00406 inline CmiBool LDCommDesc::operator==(const LDCommDesc &obj) const {
00407 if (type != obj.type) return CmiFalse;
00408 switch (type) {
00409 case LD_PROC_MSG: return (CmiBool)(dest.destProc == obj.dest.destProc);
00410 case LD_OBJ_MSG: return (CmiBool)(dest.destObj.destObj == obj.dest.destObj.destObj);
00411 case LD_OBJLIST_MSG: { if (dest.destObjs.len != obj.dest.destObjs.len)
00412 return CmiFalse;
00413 for (int i=0; i<dest.destObjs.len; i++)
00414 if (!(dest.destObjs.objs[i] == obj.dest.destObjs.objs[i])) return CmiFalse;
00415 return CmiTrue; }
00416 }
00417 return CmiFalse;
00418 }
00419 inline LDCommDesc & LDCommDesc::operator=(const LDCommDesc &c) {
00420 type = c.type;
00421 switch (type) {
00422 case LD_PROC_MSG: dest.destProc = c.dest.destProc; break;
00423 case LD_OBJ_MSG: dest.destObj.destObj = c.dest.destObj.destObj; break;
00424 case LD_OBJLIST_MSG: { dest.destObjs.len = c.dest.destObjs.len;
00425 dest.destObjs.objs = new LDObjKey[dest.destObjs.len];
00426 for (int i=0; i<dest.destObjs.len; i++)
00427 dest.destObjs.objs[i] = c.dest.destObjs.objs[i];
00428 break; }
00429 }
00430 return *this;
00431 }
00432 inline void LDCommDesc::pup(PUP::er &p) {
00433 p|type;
00434 switch (type) {
00435 case LD_PROC_MSG: p|dest.destProc; break;
00436 case LD_OBJ_MSG: p|dest.destObj.destObj;
00437 if (_lb_version == -1 && p.isUnpacking())
00438 dest.destObj.destObjProc = -1;
00439 else
00440 p|dest.destObj.destObjProc;
00441 break;
00442 case LD_OBJLIST_MSG: { p|dest.destObjs.len;
00443 if (p.isUnpacking())
00444 dest.destObjs.objs = new LDObjKey[dest.destObjs.len];
00445 for (int i=0; i<dest.destObjs.len; i++) p|dest.destObjs.objs[i];
00446 break; }
00447 }
00448 }
00449 PUPmarshall(LDCommDesc)
00450
00451 inline void LDCommData::pup(PUP::er &p) {
00452 p|src_proc;
00453 p|sender;
00454 p|receiver;
00455 p|messages;
00456 p|bytes;
00457 if (p.isUnpacking()) {
00458 sendHash = recvHash = -1;
00459 }
00460 }
00461 PUPmarshall(LDCommData)
00462 #endif
00463
00464 #endif
00465