ck-ldb/lbdb.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * $Source: /cvsroot/charm/src/ck-ldb/lbdb.h,v $
00003  * $Author: gzheng $
00004  * $Date: 2006-11-29 22:16:09 $
00005  * $Revision: 1.64 $
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; /* To eliminate warnings, because a C void* is not
00027                         the same as a C++ void* */
00028 
00029   /*  User-defined object ID is 4 ints long */
00030 #define OBJ_ID_SZ 4
00031 
00032 #if CMK_LBDB_ON
00033 typedef struct {
00034   void *handle;            // pointer to LBDB
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 //  void *user_ptr;
00056   LDOMid id;
00057   int handle;           // index to LBOM
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 /* LDObjKey uniquely identify one object */
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 /* used by load balancer */
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;               /* 1:   processor level message */
00140     struct{
00141       LDObjKey  destObj;                /* 2:   object based message    */
00142       int destObjProc;
00143     } destObj;
00144     struct {
00145       LDObjKey  *objs;
00146       int len;
00147     } destObjs;                 /* 3:   one to many message     */
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;                 // sender can either be a proc or an obj
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  * Requests to load balancer
00203  *   FIXME: these routines don't seem to exist anywhere-- are they obsolete?
00204  *   Are the official versions now in LBDatabase.h?
00205  */
00206 void LBBalance(void *param);
00207 void LBCollectStatsOn(void);
00208 void LBCollectStatsOff(void);
00209 
00210 /*
00211  * Callbacks from database to object managers
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  * Calls from object managers to load database
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  * Calls from load balancer to load database
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  * Local Barrier calls
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  *  LBDB Configuration calls
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 /* _cplusplus */
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   // skip ldb since it is a pointer
00373   int ptrSize = sizeof(void *);
00374   p|ptrSize;
00375   // if pointer size is not expected, must be in simulation mode
00376   // ignore this field
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   }   // end of switch
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 /* LBDBH_H */
00465 

Generated on Sun Jun 29 13:29:10 2008 for Charm++ by  doxygen 1.5.1