00001
00005
00006 #include <converse.h>
00007
00008 #include <math.h>
00009
00010 #include "lbdb.h"
00011 #include "LBObj.h"
00012 #include "LBOM.h"
00013 #include "LBDatabase.h"
00014 #include "LBDBManager.h"
00015
00016 #if CMK_LBDB_ON
00017
00018 extern "C" LDHandle LDCreate(void)
00019 {
00020 LDHandle h;
00021 h.handle = (void*)(new LBDB);
00022 return h;
00023 }
00024
00025 extern "C" LDOMHandle LDRegisterOM(LDHandle _db, LDOMid _userID,
00026 void *_userptr, LDCallbacks _callbacks)
00027 {
00028 LBDB *const db = (LBDB*)(_db.handle);
00029 return db->AddOM(_userID, _userptr, _callbacks);
00030 }
00031
00032 extern "C" void * LDOMUserData(LDOMHandle &_h)
00033 {
00034 LBDB *const db = (LBDB*)(_h.ldb.handle);
00035 return db->LbOM(_h)->getUserData();
00036 }
00037
00038 extern "C" void LDRegisteringObjects(LDOMHandle _h)
00039 {
00040 LBDB *const db = (LBDB*)(_h.ldb.handle);
00041 db->RegisteringObjects(_h);
00042 }
00043
00044 extern "C" void LDDoneRegisteringObjects(LDOMHandle _h)
00045 {
00046 LBDB *const db = (LBDB*)(_h.ldb.handle);
00047 db->DoneRegisteringObjects(_h);
00048 }
00049
00050 extern "C" LDObjHandle LDRegisterObj(LDOMHandle _h, LDObjid _id,
00051 void *_userData, int _migratable)
00052 {
00053 LBDB *const db = (LBDB*)(_h.ldb.handle);
00054 return db->AddObj(_h, _id, _userData, (CmiBool)(_migratable));
00055 }
00056
00057 extern "C" void LDUnregisterObj(LDObjHandle _h)
00058 {
00059 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00060 db->UnregisterObj(_h);
00061 return;
00062 }
00063
00064 extern "C" const LDObjHandle &LDGetObjHandle(LDHandle h, int oh)
00065 {
00066 LBDB *const db = (LBDB*)(h.handle);
00067 LBObj *const obj = db->LbObjIdx(oh);
00068 return obj->GetLDObjHandle();
00069 }
00070
00071 extern "C" void LDObjTime(LDObjHandle &_h,
00072 LBRealType walltime, LBRealType cputime)
00073 {
00074 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00075 LBObj *const obj = db->LbObj(_h);
00076 obj->IncrementTime(walltime,cputime);
00077 }
00078
00079 extern "C" void LDGetObjLoad(LDObjHandle &_h, LBRealType *wallT, LBRealType *cpuT)
00080 {
00081 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00082 LBObj *const obj = db->LbObj(_h);
00083 obj->getTime(wallT, cpuT);
00084 }
00085
00086 extern "C" void LDQueryKnownObjLoad(LDObjHandle &_h, LBRealType *wallT, LBRealType *cpuT)
00087 {
00088 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00089 LBObj *const obj = db->LbObj(_h);
00090 obj->lastKnownLoad(wallT, cpuT);
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" int LDAddMigrationDoneFn(LDHandle _db, LDMigrationDoneFn fn, void* data)
00143 {
00144 LBDB *const db = (LBDB*)(_db.handle);
00145 return db->AddMigrationDoneFn(fn,data);
00146 }
00147
00148 extern "C" void LDRemoveMigrationDoneFn(LDHandle _db, LDMigrationDoneFn fn)
00149 {
00150 LBDB *const db = (LBDB*)(_db.handle);
00151 db->RemoveMigrationDoneFn(fn);
00152 }
00153
00154 extern "C" void LDMigrationDone(LDHandle _db)
00155 {
00156 LBDB *const db = (LBDB*)(_db.handle);
00157 db->MigrationDone();
00158 }
00159
00160 extern "C" void LDTurnPredictorOn(LDHandle _db, void *model)
00161 {
00162 LBDB *const db = (LBDB*)(_db.handle);
00163 db->TurnPredictorOn(model);
00164 }
00165
00166 extern "C" void LDTurnPredictorOnWin(LDHandle _db, void *model, int wind)
00167 {
00168 LBDB *const db = (LBDB*)(_db.handle);
00169 db->TurnPredictorOn(model, wind);
00170 }
00171
00172 extern "C" void LDTurnPredictorOff(LDHandle _db)
00173 {
00174 LBDB *const db = (LBDB*)(_db.handle);
00175 db->TurnPredictorOff();
00176 }
00177
00178
00179 extern "C" void LDChangePredictor(LDHandle _db, void *model)
00180 {
00181 LBDB *const db = (LBDB*)(_db.handle);
00182 db->ChangePredictor(model);
00183 }
00184
00185 extern "C" void LDCollectStatsOn(LDHandle _db)
00186 {
00187 LBDB *const db = (LBDB*)(_db.handle);
00188
00189 if (!db->StatsOn()) {
00190 if (db->ObjIsRunning()) {
00191
00192 const LDObjHandle &oh = db->RunningObj();
00193 LBObj *obj = db->LbObj(oh);
00194 obj->StartTimer();
00195 }
00196 db->TurnStatsOn();
00197 }
00198 }
00199
00200 extern "C" void LDCollectStatsOff(LDHandle _db)
00201 {
00202 LBDB *const db = (LBDB*)(_db.handle);
00203 db->TurnStatsOff();
00204 }
00205
00206 extern "C" int CLDCollectingStats(LDHandle _db)
00207 {
00208
00209
00210
00211 return LDCollectingStats(_db);
00212 }
00213
00214 extern "C" int CLDRunningObject(LDHandle _h, LDObjHandle* _o)
00215 {
00216 return LDRunningObject(_h, _o);
00217 }
00218
00219 extern "C" void LDObjectStart(const LDObjHandle &_h)
00220 {
00221 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00222
00223 if (db->ObjIsRunning()) LDObjectStop(db->RunningObj());
00224
00225 db->SetRunningObj(_h);
00226
00227 if (db->StatsOn()) {
00228 LBObj *const obj = db->LbObj(_h);
00229 obj->StartTimer();
00230 }
00231 }
00232
00233 extern "C" void LDObjectStop(const LDObjHandle &_h)
00234 {
00235 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00236 LBObj *const obj = db->LbObj(_h);
00237
00238 if (db->StatsOn()) {
00239 LBRealType walltime, cputime;
00240 obj->StopTimer(&walltime,&cputime);
00241 obj->IncrementTime(walltime,cputime);
00242 }
00243 db->NoRunningObj();
00244 }
00245
00246 extern "C" void LDSend(const LDOMHandle &destOM, const LDObjid &destid, unsigned int bytes, int destObjProc, int force)
00247 {
00248 LBDB *const db = (LBDB*)(destOM.ldb.handle);
00249 if (force || db->StatsOn() && _lb_args.traceComm())
00250 db->Send(destOM,destid,bytes, destObjProc);
00251 }
00252
00253 extern "C" void LDMulticastSend(const LDOMHandle &destOM, LDObjid *destids, int ndests, unsigned int bytes, int nMsgs)
00254 {
00255 LBDB *const db = (LBDB*)(destOM.ldb.handle);
00256 if (db->StatsOn() && _lb_args.traceComm())
00257 db->MulticastSend(destOM,destids,ndests,bytes,nMsgs);
00258 }
00259
00260 extern "C" void LDBackgroundLoad(LDHandle _db,
00261 LBRealType* walltime, LBRealType* cputime)
00262 {
00263 LBDB *const db = (LBDB*)(_db.handle);
00264 db->BackgroundLoad(walltime,cputime);
00265
00266 return;
00267 }
00268
00269 extern "C" void LDIdleTime(LDHandle _db,LBRealType* walltime)
00270 {
00271 LBDB *const db = (LBDB*)(_db.handle);
00272 db->IdleTime(walltime);
00273
00274 return;
00275 }
00276
00277 extern "C" void LDTotalTime(LDHandle _db,LBRealType* walltime, LBRealType* cputime)
00278 {
00279 LBDB *const db = (LBDB*)(_db.handle);
00280 db->TotalTime(walltime,cputime);
00281
00282 return;
00283 }
00284
00285 extern "C" void LDGetTime(LDHandle _db, LBRealType *total_walltime,
00286 LBRealType *total_cputime,
00287 LBRealType *idletime, LBRealType *bg_walltime, LBRealType *bg_cputime)
00288 {
00289 LBDB *const db = (LBDB*)(_db.handle);
00290 db->GetTime(total_walltime, total_cputime, idletime, bg_walltime, bg_cputime);
00291 }
00292
00293 extern "C" void LDNonMigratable(const LDObjHandle &h)
00294 {
00295 LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
00296 LBObj *const obj = db->LbObj(h);
00297
00298 obj->SetMigratable(CmiFalse);
00299 }
00300
00301 extern "C" void LDMigratable(const LDObjHandle &h)
00302 {
00303 LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
00304 LBObj *const obj = db->LbObj(h);
00305
00306 obj->SetMigratable(CmiTrue);
00307 }
00308
00309 extern "C" void LDAsyncMigrate(const LDObjHandle &h, CmiBool async)
00310 {
00311 LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
00312 LBObj *const obj = db->LbObj(h);
00313
00314 obj->UseAsyncMigrate(async);
00315 }
00316
00317 extern "C" void LDClearLoads(LDHandle _db)
00318 {
00319 LBDB *const db = (LBDB*)(_db.handle);
00320
00321 db->ClearLoads();
00322 }
00323
00324 extern "C" int LDGetObjDataSz(LDHandle _db)
00325 {
00326 LBDB *const db = (LBDB*)(_db.handle);
00327
00328 return db->ObjDataCount();
00329 }
00330
00331 extern "C" void LDGetObjData(LDHandle _db, LDObjData *data)
00332 {
00333 LBDB *const db = (LBDB*)(_db.handle);
00334
00335 db->GetObjData(data);
00336 }
00337
00338 extern "C" int LDGetCommDataSz(LDHandle _db)
00339 {
00340 LBDB *const db = (LBDB*)(_db.handle);
00341
00342 return db->CommDataCount();
00343 }
00344
00345 extern "C" void LDGetCommData(LDHandle _db, LDCommData *data)
00346 {
00347 LBDB *const db = (LBDB*)(_db.handle);
00348
00349 db->GetCommData(data);
00350 return;
00351 }
00352
00353 extern "C" int LDMigrate(LDObjHandle _h, int dest)
00354 {
00355 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00356
00357 return db->Migrate(_h,dest);
00358 }
00359
00360 extern "C" void LDMigrated(LDObjHandle _h, int waitBarrier)
00361 {
00362 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
00363
00364 db->Migrated(_h, waitBarrier);
00365 }
00366
00367 extern "C" LDBarrierClient
00368 LDAddLocalBarrierClient(LDHandle _db, LDResumeFn fn, void* data)
00369 {
00370 LBDB *const db = (LBDB*)(_db.handle);
00371
00372 return db->AddLocalBarrierClient(fn,data);
00373 }
00374
00375 extern "C" void LDRemoveLocalBarrierClient(LDHandle _db, LDBarrierClient h)
00376 {
00377 LBDB *const db = (LBDB*)(_db.handle);
00378
00379 db->RemoveLocalBarrierClient(h);
00380 }
00381
00382 extern "C" LDBarrierReceiver
00383 LDAddLocalBarrierReceiver(LDHandle _db,LDBarrierFn fn, void* data)
00384 {
00385 LBDB *const db = (LBDB*)(_db.handle);
00386
00387 return db->AddLocalBarrierReceiver(fn,data);
00388 }
00389
00390 extern "C" void
00391 LDRemoveLocalBarrierReceiver(LDHandle _db,LDBarrierReceiver h)
00392 {
00393 LBDB *const db = (LBDB*)(_db.handle);
00394
00395 db->RemoveLocalBarrierReceiver(h);
00396 }
00397
00398 extern "C" void LDAtLocalBarrier(LDHandle _db, LDBarrierClient h)
00399 {
00400 LBDB *const db = (LBDB*)(_db.handle);
00401
00402 db->AtLocalBarrier(h);
00403 }
00404
00405 extern "C" void LDLocalBarrierOn(LDHandle _db)
00406 {
00407 LBDB *const db = (LBDB*)(_db.handle);
00408
00409 db->LocalBarrierOn();
00410 }
00411
00412 extern "C" void LDLocalBarrierOff(LDHandle _db)
00413 {
00414 LBDB *const db = (LBDB*)(_db.handle);
00415
00416 db->LocalBarrierOff();
00417 }
00418
00419
00420 extern "C" void LDResumeClients(LDHandle _db)
00421 {
00422 LBDB *const db = (LBDB*)(_db.handle);
00423
00424 db->ResumeClients();
00425 }
00426
00427 static void work(int iter_block, int* result) {
00428 int i;
00429 *result = 1;
00430 for(i=0; i < iter_block; i++) {
00431 double b=0.1 + 0.1 * *result;
00432 *result=(int)(sqrt(1+cos(b * 1.57)));
00433 }
00434 }
00435
00436 extern "C" int LDProcessorSpeed()
00437 {
00438
00439
00440 static int thisProcessorSpeed = -1;
00441
00442 if (_lb_args.samePeSpeed() || CkNumPes() == 1)
00443 return 1;
00444
00445 if (thisProcessorSpeed != -1) return thisProcessorSpeed;
00446
00447
00448
00449 static int result=0;
00450
00451 int wps = 0;
00452 const double elapse = 0.4;
00453
00454
00455 const double end_time = CmiCpuTimer()+elapse;
00456 wps = 0;
00457 while(CmiCpuTimer() < end_time) {
00458 work(1000,&result);
00459 wps+=1000;
00460 }
00461
00462
00463
00464
00465
00466
00467
00468 for(int i=0; i < 2; i++) {
00469 const double start_time = CmiCpuTimer();
00470 work(wps,&result);
00471 const double end_time = CmiCpuTimer();
00472 const double correction = elapse / (end_time-start_time);
00473 wps = (int)((double)wps * correction + 0.5);
00474 }
00475
00476
00477
00478
00479
00480
00481
00482 thisProcessorSpeed = wps;
00483
00484
00485
00486 return wps;
00487 }
00488
00489 extern "C" void LDSetLBPeriod(LDHandle _db, double s)
00490 {
00491 LBDB *const db = (LBDB*)(_db.handle);
00492 db->SetPeriod(s);
00493 }
00494
00495 extern "C" double LDGetLBPeriod(LDHandle _db)
00496 {
00497 LBDB *const db = (LBDB*)(_db.handle);
00498 return db->GetPeriod();
00499 }
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509 extern "C" void LDQueryEstLoad(LDHandle bdb)
00510 {
00511 }
00512
00513 extern "C" int LDMemusage(LDHandle _db)
00514 {
00515 LBDB *const db = (LBDB*)(_db.handle);
00516 return db->useMem();
00517 }
00518
00519 #else
00520 extern "C" int LDProcessorSpeed() { return 1; }
00521 #endif // CMK_LBDB_ON
00522
00523 CmiBool LDOMidEqual(const LDOMid &i1, const LDOMid &i2)
00524 {
00525 return i1.id == i2.id?CmiTrue:CmiFalse;
00526 }
00527
00528 CmiBool LDObjIDEqual(const LDObjid &i1, const LDObjid &i2)
00529 {
00530 return (CmiBool)(i1.id[0] == i2.id[0]
00531 && i1.id[1] == i2.id[1] && i1.id[2] == i2.id[2]
00532 && i1.id[3] == i2.id[3]);
00533 }
00534