ck-ldb/lbdb.C

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * $Source: /cvsroot/charm/src/ck-ldb/lbdb.C,v $
00003  * $Author: gzheng $
00004  * $Date: 2006-11-29 22:16:09 $
00005  * $Revision: 1.54 $
00006  *****************************************************************************/
00007 
00012 
00013 #include <converse.h>
00014 
00015 #include <math.h>
00016 
00017 #include "lbdb.h"
00018 #include "LBObj.h"
00019 #include "LBOM.h"
00020 #include "LBDatabase.h"
00021 #include "LBDBManager.h"
00022   
00023 #if CMK_LBDB_ON
00024 
00025 extern "C" LDHandle LDCreate(void)
00026 {
00027   LDHandle h;
00028   h.handle = (void*)(new LBDB);
00029   return h;
00030 }
00031 
00032 extern "C" LDOMHandle LDRegisterOM(LDHandle _db, LDOMid _userID,
00033                                    void *_userptr, LDCallbacks _callbacks)
00034 {
00035   LBDB *const db = (LBDB*)(_db.handle);
00036   return db->AddOM(_userID, _userptr, _callbacks);
00037 }
00038 
00039 extern "C" void * LDOMUserData(LDOMHandle &_h)
00040 {
00041   LBDB *const db = (LBDB*)(_h.ldb.handle);
00042   return db->LbOM(_h)->getUserData();
00043 }
00044 
00045 extern "C" void LDRegisteringObjects(LDOMHandle _h)
00046 {
00047   LBDB *const db = (LBDB*)(_h.ldb.handle);
00048   db->RegisteringObjects(_h);
00049 }
00050 
00051 extern "C" void LDDoneRegisteringObjects(LDOMHandle _h)
00052 {
00053   LBDB *const db = (LBDB*)(_h.ldb.handle);
00054   db->DoneRegisteringObjects(_h);
00055 }
00056 
00057 extern "C" LDObjHandle LDRegisterObj(LDOMHandle _h, LDObjid _id, 
00058                                        void *_userData, int _migratable)
00059 {
00060   LBDB *const db = (LBDB*)(_h.ldb.handle);
00061   return db->AddObj(_h, _id, _userData, (CmiBool)(_migratable));
00062 }
00063 
00064 extern "C" void LDUnregisterObj(LDObjHandle _h)
00065 {
00066   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00067   db->UnregisterObj(_h);
00068   return;
00069 }
00070 
00071 extern "C" const LDObjHandle &LDGetObjHandle(LDHandle h, int oh)
00072 {
00073   LBDB *const db = (LBDB*)(h.handle);
00074   LBObj *const obj = db->LbObjIdx(oh);
00075   return obj->GetLDObjHandle();
00076 }
00077 
00078 extern "C" void LDObjTime(LDObjHandle &_h,
00079                             double walltime, double cputime)
00080 {
00081   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00082   LBObj *const obj = db->LbObj(_h);
00083   obj->IncrementTime(walltime,cputime);
00084 }
00085   
00086 extern "C" void LDQueryKnownObjLoad(LDObjHandle &_h, double *cpuT, double *wallT)
00087 {
00088   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00089   LBObj *const obj = db->LbObj(_h);
00090   obj->lastKnownLoad(cpuT, wallT);
00091 }
00092 
00093 extern "C" void * LDObjUserData(LDObjHandle &_h)
00094 {
00095   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00096   LBObj *const obj = db->LbObj(_h);
00097   return obj->getUserData();
00098 }
00099 
00100 extern "C" void LDDumpDatabase(LDHandle _db)
00101 {
00102   LBDB *const db = (LBDB*)(_db.handle);
00103   db->DumpDatabase();
00104 }
00105 
00106 extern "C" void LDNotifyMigrated(LDHandle _db, LDMigratedFn fn, void* data)
00107 {
00108   LBDB *const db = (LBDB*)(_db.handle);
00109   db->NotifyMigrated(fn,data);
00110 }
00111 
00112 extern "C" void LDAddStartLBFn(LDHandle _db, LDStartLBFn fn, void* data)
00113 {
00114   LBDB *const db = (LBDB*)(_db.handle);
00115   db->AddStartLBFn(fn,data);
00116 }
00117 
00118 extern "C" void LDRemoveStartLBFn(LDHandle _db, LDStartLBFn fn)
00119 {
00120   LBDB *const db = (LBDB*)(_db.handle);
00121   db->RemoveStartLBFn(fn);
00122 }
00123 
00124 extern "C" void LDStartLB(LDHandle _db)
00125 {
00126   LBDB *const db = (LBDB*)(_db.handle);
00127   db->StartLB();
00128 }
00129 
00130 extern "C" void LDTurnManualLBOn(LDHandle _db)
00131 {
00132   LBDB *const db = (LBDB*)(_db.handle);
00133   db->TurnManualLBOn();
00134 }
00135 
00136 extern "C" void LDTurnManualLBOff(LDHandle _db)
00137 {
00138   LBDB *const db = (LBDB*)(_db.handle);
00139   db->TurnManualLBOff();
00140 }
00141 
00142 extern "C" void LDTurnPredictorOn(LDHandle _db, void *model)
00143 {
00144   LBDB *const db = (LBDB*)(_db.handle);
00145   db->TurnPredictorOn(model);
00146 }
00147 
00148 extern "C" void LDTurnPredictorOnWin(LDHandle _db, void *model, int wind)
00149 {
00150   LBDB *const db = (LBDB*)(_db.handle);
00151   db->TurnPredictorOn(model, wind);
00152 }
00153 
00154 extern "C" void LDTurnPredictorOff(LDHandle _db)
00155 {
00156   LBDB *const db = (LBDB*)(_db.handle);
00157   db->TurnPredictorOff();
00158 }
00159 
00160 /* the parameter model is really of class LBPredictorFunction in file LBDatabase.h */
00161 extern "C" void LDChangePredictor(LDHandle _db, void *model)
00162 {
00163   LBDB *const db = (LBDB*)(_db.handle);
00164   db->ChangePredictor(model);
00165 }
00166 
00167 extern "C" void LDCollectStatsOn(LDHandle _db)
00168 {
00169   LBDB *const db = (LBDB*)(_db.handle);
00170 
00171   if (!db->StatsOn()) {
00172     if (db->ObjIsRunning()) {
00173        // stats on in the middle of an entry, start timer
00174       const LDObjHandle &oh = db->RunningObj();
00175       LBObj *obj = db->LbObj(oh);
00176       obj->StartTimer();
00177     }
00178     db->TurnStatsOn();
00179   }
00180 }
00181 
00182 extern "C" void LDCollectStatsOff(LDHandle _db)
00183 {
00184   LBDB *const db = (LBDB*)(_db.handle);
00185   db->TurnStatsOff();
00186 }
00187 
00188 extern "C" int CLDCollectingStats(LDHandle _db)
00189 {
00190 //  LBDB *const db = (LBDB*)(_db.handle);
00191 //
00192 //  return db->StatsOn();
00193   return LDCollectingStats(_db);
00194 }
00195 
00196 extern "C" int CLDRunningObject(LDHandle _h, LDObjHandle* _o)
00197 {
00198   return LDRunningObject(_h, _o);
00199 }
00200 
00201 extern "C" void LDObjectStart(const LDObjHandle &_h)
00202 {
00203   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00204 
00205   if (db->ObjIsRunning()) LDObjectStop(db->RunningObj());
00206 
00207   db->SetRunningObj(_h);
00208 
00209   if (db->StatsOn()) {
00210     LBObj *const obj = db->LbObj(_h);
00211     obj->StartTimer();
00212   }
00213 }
00214 
00215 extern "C" void LDObjectStop(const LDObjHandle &_h)
00216 {
00217   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00218   LBObj *const obj = db->LbObj(_h);
00219 
00220   if (db->StatsOn()) {
00221     double walltime, cputime;
00222     obj->StopTimer(&walltime,&cputime);
00223     obj->IncrementTime(walltime,cputime);
00224   }
00225   db->NoRunningObj();
00226 }
00227 
00228 extern "C" void LDSend(const LDOMHandle &destOM, const LDObjid &destid, unsigned int bytes, int destObjProc)
00229 {
00230   LBDB *const db = (LBDB*)(destOM.ldb.handle);
00231   if (db->StatsOn() && _lb_args.traceComm())
00232     db->Send(destOM,destid,bytes, destObjProc);
00233 }
00234 
00235 extern "C" void LDMulticastSend(const LDOMHandle &destOM, LDObjid *destids, int ndests, unsigned int bytes, int nMsgs)
00236 {
00237   LBDB *const db = (LBDB*)(destOM.ldb.handle);
00238   if (db->StatsOn() && _lb_args.traceComm())
00239     db->MulticastSend(destOM,destids,ndests,bytes,nMsgs);
00240 }
00241 
00242 extern "C" void LDBackgroundLoad(LDHandle _db,
00243                                  double* walltime, double* cputime)
00244 {
00245   LBDB *const db = (LBDB*)(_db.handle);
00246   db->BackgroundLoad(walltime,cputime);
00247 
00248   return;
00249 }
00250 
00251 extern "C" void LDIdleTime(LDHandle _db,double* walltime)
00252 {
00253   LBDB *const db = (LBDB*)(_db.handle);
00254   db->IdleTime(walltime);
00255 
00256   return;
00257 }
00258 
00259 extern "C" void LDTotalTime(LDHandle _db,double* walltime, double* cputime)
00260 {
00261   LBDB *const db = (LBDB*)(_db.handle);
00262   db->TotalTime(walltime,cputime);
00263 
00264   return;
00265 }
00266 
00267 extern "C" void LDGetTime(LDHandle _db, double *total_walltime,
00268                    double *total_cputime,
00269                    double *idletime, double *bg_walltime, double *bg_cputime)
00270 {
00271   LBDB *const db = (LBDB*)(_db.handle);
00272   db->GetTime(total_walltime, total_cputime, idletime, bg_walltime, bg_cputime);
00273 }
00274 
00275 extern "C" void LDNonMigratable(const LDObjHandle &h)
00276 {
00277   LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
00278   LBObj *const obj = db->LbObj(h);
00279 
00280   obj->SetMigratable(CmiFalse);
00281 }
00282 
00283 extern "C" void LDMigratable(const LDObjHandle &h)
00284 {
00285   LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
00286   LBObj *const obj = db->LbObj(h);
00287 
00288   obj->SetMigratable(CmiTrue);
00289 }
00290 
00291 extern "C" void LDAsyncMigrate(const LDObjHandle &h, CmiBool async)
00292 {
00293   LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
00294   LBObj *const obj = db->LbObj(h);
00295 
00296   obj->UseAsyncMigrate(async);
00297 }
00298 
00299 extern "C" void LDClearLoads(LDHandle _db)
00300 {
00301   LBDB *const db = (LBDB*)(_db.handle);
00302 
00303   db->ClearLoads();
00304 }
00305 
00306 extern "C" int LDGetObjDataSz(LDHandle _db)
00307 {
00308   LBDB *const db = (LBDB*)(_db.handle);
00309 
00310   return db->ObjDataCount();
00311 }
00312 
00313 extern "C" void LDGetObjData(LDHandle _db, LDObjData *data)
00314 {
00315   LBDB *const db = (LBDB*)(_db.handle);
00316 
00317   db->GetObjData(data);
00318 }
00319 
00320 extern "C" int LDGetCommDataSz(LDHandle _db)
00321 {
00322   LBDB *const db = (LBDB*)(_db.handle);
00323 
00324   return db->CommDataCount();
00325 }
00326 
00327 extern "C" void LDGetCommData(LDHandle _db, LDCommData *data)
00328 {
00329   LBDB *const db = (LBDB*)(_db.handle);
00330 
00331   db->GetCommData(data);
00332   return;
00333 }
00334 
00335 extern "C" int LDMigrate(LDObjHandle _h, int dest)
00336 {
00337   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00338 
00339   return db->Migrate(_h,dest);
00340 }
00341 
00342 extern "C" void LDMigrated(LDObjHandle _h, int waitBarrier)
00343 {
00344   LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00345 
00346   db->Migrated(_h, waitBarrier);
00347 }
00348 
00349 extern "C" LDBarrierClient 
00350 LDAddLocalBarrierClient(LDHandle _db, LDResumeFn fn, void* data)
00351 {
00352   LBDB *const db = (LBDB*)(_db.handle);
00353 
00354   return db->AddLocalBarrierClient(fn,data);
00355 }
00356 
00357 extern "C" void LDRemoveLocalBarrierClient(LDHandle _db, LDBarrierClient h)
00358 {
00359   LBDB *const db = (LBDB*)(_db.handle);
00360 
00361   db->RemoveLocalBarrierClient(h);
00362 }
00363 
00364 extern "C" LDBarrierReceiver 
00365 LDAddLocalBarrierReceiver(LDHandle _db,LDBarrierFn fn, void* data)
00366 {
00367   LBDB *const db = (LBDB*)(_db.handle);
00368 
00369   return db->AddLocalBarrierReceiver(fn,data);
00370 }
00371 
00372 extern "C" void 
00373 LDRemoveLocalBarrierReceiver(LDHandle _db,LDBarrierReceiver h)
00374 {
00375   LBDB *const db = (LBDB*)(_db.handle);
00376 
00377   db->RemoveLocalBarrierReceiver(h);
00378 }
00379 
00380 extern "C" void LDAtLocalBarrier(LDHandle _db, LDBarrierClient h)
00381 {
00382   LBDB *const db = (LBDB*)(_db.handle);
00383         
00384   db->AtLocalBarrier(h);
00385 }
00386 
00387 extern "C" void LDLocalBarrierOn(LDHandle _db)
00388 {
00389   LBDB *const db = (LBDB*)(_db.handle);
00390 
00391   db->LocalBarrierOn();
00392 }
00393 
00394 extern "C" void LDLocalBarrierOff(LDHandle _db)
00395 {
00396   LBDB *const db = (LBDB*)(_db.handle);
00397 
00398   db->LocalBarrierOff();
00399 }
00400 
00401 
00402 extern "C" void LDResumeClients(LDHandle _db)
00403 {
00404   LBDB *const db = (LBDB*)(_db.handle);
00405 
00406   db->ResumeClients();
00407 }
00408 
00409 static void work(int iter_block, int* result) {
00410   int i;
00411   *result = 1;
00412   for(i=0; i < iter_block; i++) {
00413     double b=0.1 + 0.1 * *result;
00414     *result=(int)(sqrt(1+cos(b * 1.57)));
00415   }
00416 }
00417 
00418 extern "C" int LDProcessorSpeed()
00419 {
00420   // for SMP version, if one processor have done this testing,
00421   // we can skip the other processors by remember the number here
00422   static int thisProcessorSpeed = -1;
00423 
00424   if (_lb_args.samePeSpeed() || CkNumPes() == 1)  // I think it is safe to assume that we can
00425     return 1;            // skip this if we are only using 1 PE
00426   
00427   if (thisProcessorSpeed != -1) return thisProcessorSpeed;
00428 
00429   //if (CkMyPe()==0) CkPrintf("Measuring processor speeds...");
00430 
00431   static int result=0;  // I don't care what this is, its just for
00432                         // timing, so this is thread safe.
00433   int wps = 0;
00434   const double elapse = 0.4;
00435   // First, count how many iterations for .2 second.
00436   // Since we are doing lots of function calls, this will be rough
00437   const double end_time = CmiCpuTimer()+elapse;
00438   wps = 0;
00439   while(CmiCpuTimer() < end_time) {
00440     work(1000,&result);
00441     wps+=1000;
00442   }
00443 
00444   // Now we have a rough idea of how many iterations there are per
00445   // second, so just perform a few cycles of correction by
00446   // running for what we think is 1 second.  Then correct
00447   // the number of iterations per second to make it closer
00448   // to the correct value
00449   
00450   for(int i=0; i < 2; i++) {
00451     const double start_time = CmiCpuTimer();
00452     work(wps,&result);
00453     const double end_time = CmiCpuTimer();
00454     const double correction = elapse / (end_time-start_time);
00455     wps = (int)((double)wps * correction + 0.5);
00456   }
00457   
00458   // If necessary, do a check now
00459   //    const double start_time3 = CmiWallTimer();
00460   //    work(msec * 1e-3 * wps);
00461   //    const double end_time3 = CmiWallTimer();
00462   //    CkPrintf("[%d] Work block size is %d %d %f\n",
00463   //         thisIndex,wps,msec,1.e3*(end_time3-start_time3));
00464   thisProcessorSpeed = wps;
00465 
00466   //if (CkMyPe()==0) CkPrintf(" Done.\n");
00467 
00468   return wps;
00469 }
00470 
00471 extern "C" void LDSetLBPeriod(LDHandle _db, double s)   // s is in seconds
00472 {
00473   LBDB *const db = (LBDB*)(_db.handle);
00474   db->SetPeriod(s);
00475 }
00476 
00477 extern "C" double LDGetLBPeriod(LDHandle _db)   // s is in seconds
00478 {
00479   LBDB *const db = (LBDB*)(_db.handle);
00480   return db->GetPeriod();
00481 }
00482 
00483 /*
00484 // to be implemented
00485 extern "C" void LDEstObjLoad(LDObjHandle h, double load)
00486 {
00487 }
00488 */
00489 
00490 // to be implemented
00491 extern "C" void LDQueryEstLoad(LDHandle bdb)
00492 {
00493 }
00494 
00495 extern "C" int LDMemusage(LDHandle _db) 
00496 {
00497   LBDB *const db = (LBDB*)(_db.handle);
00498   return db->useMem();
00499 }
00500 
00501 #else
00502 extern "C" int LDProcessorSpeed() { return 1; }
00503 #endif // CMK_LBDB_ON
00504 
00505 CmiBool LDOMidEqual(const LDOMid &i1, const LDOMid &i2)
00506 {
00507  return i1.id == i2.id?CmiTrue:CmiFalse;
00508 }
00509 
00510 CmiBool LDObjIDEqual(const LDObjid &i1, const LDObjid &i2)
00511 {
00512   return (CmiBool)(i1.id[0] == i2.id[0] 
00513          && i1.id[1] == i2.id[1] && i1.id[2] == i2.id[2] 
00514          && i1.id[3] == i2.id[3]);
00515 }
00516 

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