00001
00002
00003
00004
00005
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
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
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
00191
00192
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
00421
00422 static int thisProcessorSpeed = -1;
00423
00424 if (_lb_args.samePeSpeed() || CkNumPes() == 1)
00425 return 1;
00426
00427 if (thisProcessorSpeed != -1) return thisProcessorSpeed;
00428
00429
00430
00431 static int result=0;
00432
00433 int wps = 0;
00434 const double elapse = 0.4;
00435
00436
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
00445
00446
00447
00448
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
00459
00460
00461
00462
00463
00464 thisProcessorSpeed = wps;
00465
00466
00467
00468 return wps;
00469 }
00470
00471 extern "C" void LDSetLBPeriod(LDHandle _db, double s)
00472 {
00473 LBDB *const db = (LBDB*)(_db.handle);
00474 db->SetPeriod(s);
00475 }
00476
00477 extern "C" double LDGetLBPeriod(LDHandle _db)
00478 {
00479 LBDB *const db = (LBDB*)(_db.handle);
00480 return db->GetPeriod();
00481 }
00482
00483
00484
00485
00486
00487
00488
00489
00490
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