13 #include "LBDatabase.h"
14 #include "LBDBManager.h"
18 extern "C" LDHandle LDCreate(void)
21 h.handle = (void*)(new LBDB);
25 extern "C" LDOMHandle LDRegisterOM(LDHandle _db, LDOMid _userID,
26 void *_userptr, LDCallbacks _callbacks)
28 LBDB *const db = (LBDB*)(_db.handle);
29 return db->AddOM(_userID, _userptr, _callbacks);
32 extern "C" void LDUnregisterOM(LDHandle _db, LDOMHandle om)
34 LBDB *const db = (LBDB*)(_db.handle);
38 extern "C" void LDOMMetaLBResumeWaitingChares(LDHandle _db, int lb_ideal_period) {
39 LBDB *const db = (LBDB*)(_db.handle);
40 db->MetaLBResumeWaitingChares(lb_ideal_period);
43 extern "C" void LDOMMetaLBCallLBOnChares(LDHandle _db) {
44 LBDB *const db = (LBDB*)(_db.handle);
45 db->MetaLBCallLBOnChares();
48 extern "C" void * LDOMUserData(LDOMHandle &_h)
50 LBDB *const db = (LBDB*)(_h.ldb.handle);
51 return db->LbOM(_h)->getUserData();
54 extern "C" void LDRegisteringObjects(LDOMHandle _h)
56 LBDB *const db = (LBDB*)(_h.ldb.handle);
57 db->RegisteringObjects(_h);
60 extern "C" void LDDoneRegisteringObjects(LDOMHandle _h)
62 LBDB *const db = (LBDB*)(_h.ldb.handle);
63 db->DoneRegisteringObjects(_h);
66 extern "C" LDObjHandle LDRegisterObj(LDOMHandle _h, LDObjid _id,
67 void *_userData, int _migratable)
69 LBDB *const db = (LBDB*)(_h.ldb.handle);
70 return db->AddObj(_h, _id, _userData, (bool)(_migratable));
73 extern "C" void LDUnregisterObj(LDObjHandle _h)
75 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
76 db->UnregisterObj(_h);
80 const LDObjHandle &LDGetObjHandle(LDHandle h, int oh)
82 LBDB *const db = (LBDB*)(h.handle);
83 LBObj *const obj = db->LbObjIdx(oh);
84 return obj->GetLDObjHandle();
87 extern "C" void LDObjTime(LDObjHandle &_h,
88 LBRealType walltime, LBRealType cputime)
90 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
91 LBObj *const obj = db->LbObj(_h);
92 obj->IncrementTime(walltime,cputime);
93 db->MeasuredObjTime(walltime,cputime);
96 extern "C" void LDGetObjLoad(LDObjHandle &_h, LBRealType *wallT, LBRealType *cpuT)
98 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
99 LBObj *const obj = db->LbObj(_h);
100 obj->getTime(wallT, cpuT);
103 extern "C" void LDQueryKnownObjLoad(LDObjHandle &_h, LBRealType *wallT, LBRealType *cpuT)
105 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
106 LBObj *const obj = db->LbObj(_h);
107 obj->lastKnownLoad(wallT, cpuT);
110 extern "C" void * LDObjUserData(LDObjHandle &_h)
112 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
113 LBObj *const obj = db->LbObj(_h);
114 return obj->getLocalUserData();
118 extern "C" void * LDDBObjUserData(LDObjHandle &_h, int idx)
120 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
121 LBObj *const obj = db->LbObj(_h);
122 return obj->getDBUserData(idx);
126 extern "C" void LDDumpDatabase(LDHandle _db)
128 LBDB *const db = (LBDB*)(_db.handle);
132 extern "C" void LDNotifyMigrated(LDHandle _db, LDMigratedFn fn, void* data)
134 LBDB *const db = (LBDB*)(_db.handle);
135 db->NotifyMigrated(fn,data);
138 extern "C" void LDAddStartLBFn(LDHandle _db, LDStartLBFn fn, void* data)
140 LBDB *const db = (LBDB*)(_db.handle);
141 db->AddStartLBFn(fn,data);
144 extern "C" void LDRemoveStartLBFn(LDHandle _db, LDStartLBFn fn)
146 LBDB *const db = (LBDB*)(_db.handle);
147 db->RemoveStartLBFn(fn);
150 extern "C" void LDStartLB(LDHandle _db)
152 LBDB *const db = (LBDB*)(_db.handle);
156 extern "C" void LDTurnManualLBOn(LDHandle _db)
158 LBDB *const db = (LBDB*)(_db.handle);
159 db->TurnManualLBOn();
162 extern "C" void LDTurnManualLBOff(LDHandle _db)
164 LBDB *const db = (LBDB*)(_db.handle);
165 db->TurnManualLBOff();
168 extern "C" int LDAddMigrationDoneFn(LDHandle _db, LDMigrationDoneFn fn, void* data)
170 LBDB *const db = (LBDB*)(_db.handle);
171 return db->AddMigrationDoneFn(fn,data);
174 extern "C" void LDRemoveMigrationDoneFn(LDHandle _db, LDMigrationDoneFn fn)
176 LBDB *const db = (LBDB*)(_db.handle);
177 db->RemoveMigrationDoneFn(fn);
180 extern "C" void LDMigrationDone(LDHandle _db)
182 LBDB *const db = (LBDB*)(_db.handle);
186 extern "C" void LDTurnPredictorOn(LDHandle _db, void *model)
188 LBDB *const db = (LBDB*)(_db.handle);
189 db->TurnPredictorOn(model);
192 extern "C" void LDTurnPredictorOnWin(LDHandle _db, void *model, int wind)
194 LBDB *const db = (LBDB*)(_db.handle);
195 db->TurnPredictorOn(model, wind);
198 extern "C" void LDTurnPredictorOff(LDHandle _db)
200 LBDB *const db = (LBDB*)(_db.handle);
201 db->TurnPredictorOff();
204 /* the parameter model is really of class LBPredictorFunction in file LBDatabase.h */
205 extern "C" void LDChangePredictor(LDHandle _db, void *model)
207 LBDB *const db = (LBDB*)(_db.handle);
208 db->ChangePredictor(model);
211 extern "C" void LDCollectStatsOn(LDHandle _db)
213 LBDB *const db = (LBDB*)(_db.handle);
215 if (!db->StatsOn()) {
216 if (db->ObjIsRunning()) {
217 // stats on in the middle of an entry, start timer
218 const LDObjHandle &oh = db->RunningObj();
219 LBObj *obj = db->LbObj(oh);
226 extern "C" void LDCollectStatsOff(LDHandle _db)
228 LBDB *const db = (LBDB*)(_db.handle);
232 extern "C" int CLDCollectingStats(LDHandle _db)
234 // LBDB *const db = (LBDB*)(_db.handle);
236 // return db->StatsOn();
237 return LDCollectingStats(_db);
240 extern "C" int CLDRunningObject(LDHandle _h, LDObjHandle* _o)
242 return LDRunningObject(_h, _o);
245 extern "C" void LDObjectStart(const LDObjHandle &_h)
247 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
249 if (db->ObjIsRunning()) LDObjectStop(db->RunningObj());
251 db->SetRunningObj(_h);
254 LBObj *const obj = db->LbObj(_h);
259 extern "C" void LDObjectStop(const LDObjHandle &_h)
261 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
262 LBObj *const obj = db->LbObj(_h);
265 LBRealType walltime, cputime;
266 obj->StopTimer(&walltime,&cputime);
267 obj->IncrementTime(walltime,cputime);
268 db->MeasuredObjTime(walltime,cputime);
273 extern "C" void LDSend(const LDOMHandle &destOM, const LDObjid &destid, unsigned int bytes, int destObjProc, int force)
275 LBDB *const db = (LBDB*)(destOM.ldb.handle);
276 if (force || db->StatsOn() && _lb_args.traceComm())
277 db->Send(destOM,destid,bytes, destObjProc);
280 extern "C" void LDMulticastSend(const LDOMHandle &destOM, LDObjid *destids, int ndests, unsigned int bytes, int nMsgs)
282 LBDB *const db = (LBDB*)(destOM.ldb.handle);
283 if (db->StatsOn() && _lb_args.traceComm())
284 db->MulticastSend(destOM,destids,ndests,bytes,nMsgs);
287 extern "C" void LDBackgroundLoad(LDHandle _db,
288 LBRealType* walltime, LBRealType* cputime)
290 LBDB *const db = (LBDB*)(_db.handle);
291 db->BackgroundLoad(walltime,cputime);
296 extern "C" void LDIdleTime(LDHandle _db,LBRealType* walltime)
298 LBDB *const db = (LBDB*)(_db.handle);
299 db->IdleTime(walltime);
304 extern "C" void LDTotalTime(LDHandle _db,LBRealType* walltime, LBRealType* cputime)
306 LBDB *const db = (LBDB*)(_db.handle);
307 db->TotalTime(walltime,cputime);
312 extern "C" void LDGetTime(LDHandle _db, LBRealType *total_walltime,
313 LBRealType *total_cputime,
314 LBRealType *idletime, LBRealType *bg_walltime, LBRealType *bg_cputime)
316 LBDB *const db = (LBDB*)(_db.handle);
317 db->GetTime(total_walltime, total_cputime, idletime, bg_walltime, bg_cputime);
320 extern "C" void LDNonMigratable(const LDObjHandle &h)
322 LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
323 LBObj *const obj = db->LbObj(h);
325 obj->SetMigratable(false);
328 extern "C" void LDMigratable(const LDObjHandle &h)
330 LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
331 LBObj *const obj = db->LbObj(h);
333 obj->SetMigratable(true);
336 extern "C" void LDSetPupSize(const LDObjHandle &h, size_t obj_pup_size)
338 LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
339 LBObj *const obj = db->LbObj(h);
341 obj->setPupSize(obj_pup_size);
344 extern "C" void LDAsyncMigrate(const LDObjHandle &h, bool async)
346 LBDB *const db = (LBDB*)(h.omhandle.ldb.handle);
347 LBObj *const obj = db->LbObj(h);
349 obj->UseAsyncMigrate(async);
352 extern "C" void LDClearLoads(LDHandle _db)
354 LBDB *const db = (LBDB*)(_db.handle);
359 extern "C" int LDGetObjDataSz(LDHandle _db)
361 LBDB *const db = (LBDB*)(_db.handle);
363 return db->ObjDataCount();
366 extern "C" void LDGetObjData(LDHandle _db, LDObjData *data)
368 LBDB *const db = (LBDB*)(_db.handle);
370 db->GetObjData(data);
373 extern "C" int LDGetCommDataSz(LDHandle _db)
375 LBDB *const db = (LBDB*)(_db.handle);
377 return db->CommDataCount();
380 extern "C" void LDGetCommData(LDHandle _db, LDCommData *data)
382 LBDB *const db = (LBDB*)(_db.handle);
384 db->GetCommData(data);
388 extern "C" int LDMigrate(LDObjHandle _h, int dest)
390 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
392 return db->Migrate(_h,dest);
395 extern "C" void LDMigrated(LDObjHandle _h, int waitBarrier)
397 LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
399 db->Migrated(_h, waitBarrier);
402 LDBarrierClient LDAddLocalBarrierClient(LDHandle _db, LDResumeFn fn, void* data)
404 LBDB *const db = (LBDB*)(_db.handle);
406 return db->AddLocalBarrierClient(fn,data);
409 void LDRemoveLocalBarrierClient(LDHandle _db, LDBarrierClient h)
411 LBDB *const db = (LBDB*)(_db.handle);
413 db->RemoveLocalBarrierClient(h);
416 LDBarrierReceiver LDAddLocalBarrierReceiver(LDHandle _db,LDBarrierFn fn, void* data)
418 LBDB *const db = (LBDB*)(_db.handle);
420 return db->AddLocalBarrierReceiver(fn,data);
423 void LDRemoveLocalBarrierReceiver(LDHandle _db,LDBarrierReceiver h)
425 LBDB *const db = (LBDB*)(_db.handle);
427 db->RemoveLocalBarrierReceiver(h);
430 extern "C" void LDAtLocalBarrier(LDHandle _db, LDBarrierClient h)
432 LBDB *const db = (LBDB*)(_db.handle);
434 db->AtLocalBarrier(h);
437 extern "C" void LDDecreaseLocalBarrier(LDHandle _db, LDBarrierClient h, int c)
439 LBDB *const db = (LBDB*)(_db.handle);
441 db->DecreaseLocalBarrier(h, c);
444 extern "C" void LDLocalBarrierOn(LDHandle _db)
446 LBDB *const db = (LBDB*)(_db.handle);
448 db->LocalBarrierOn();
451 extern "C" void LDLocalBarrierOff(LDHandle _db)
453 LBDB *const db = (LBDB*)(_db.handle);
455 db->LocalBarrierOff();
459 extern "C" void LDResumeClients(LDHandle _db)
461 LBDB *const db = (LBDB*)(_db.handle);
466 static void work(int iter_block, int* result) {
469 for(i=0; i < iter_block; i++) {
470 double b=0.1 + 0.1 * *result;
471 *result=(int)(sqrt(1+cos(b * 1.57)));
475 extern "C" int LDProcessorSpeed()
477 // for SMP version, if one processor have done this testing,
478 // we can skip the other processors by remember the number here
479 static int thisProcessorSpeed = -1;
481 if (_lb_args.samePeSpeed() || CkNumPes() == 1) // I think it is safe to assume that we can
482 return 1; // skip this if we are only using 1 PE
484 if (thisProcessorSpeed != -1) return thisProcessorSpeed;
486 //if (CkMyPe()==0) CkPrintf("Measuring processor speeds...");
488 static int result=0; // I don't care what this is, its just for
489 // timing, so this is thread safe.
491 const double elapse = 0.4;
492 // First, count how many iterations for .2 second.
493 // Since we are doing lots of function calls, this will be rough
494 const double end_time = CmiCpuTimer()+elapse;
496 while(CmiCpuTimer() < end_time) {
501 // Now we have a rough idea of how many iterations there are per
502 // second, so just perform a few cycles of correction by
503 // running for what we think is 1 second. Then correct
504 // the number of iterations per second to make it closer
505 // to the correct value
507 for(int i=0; i < 2; i++) {
508 const double start_time = CmiCpuTimer();
510 const double end_time = CmiCpuTimer();
511 const double correction = elapse / (end_time-start_time);
512 wps = (int)((double)wps * correction + 0.5);
515 // If necessary, do a check now
516 // const double start_time3 = CmiWallTimer();
517 // work(msec * 1e-3 * wps);
518 // const double end_time3 = CmiWallTimer();
519 // CkPrintf("[%d] Work block size is %d %d %f\n",
520 // thisIndex,wps,msec,1.e3*(end_time3-start_time3));
521 thisProcessorSpeed = wps;
523 //if (CkMyPe()==0) CkPrintf(" Done.\n");
528 extern "C" void LDSetLBPeriod(LDHandle _db, double s) // s is in seconds
530 LBDB *const db = (LBDB*)(_db.handle);
534 extern "C" double LDGetLBPeriod(LDHandle _db) // s is in seconds
536 LBDB *const db = (LBDB*)(_db.handle);
537 return db->GetPeriod();
542 extern "C" void LDEstObjLoad(LDObjHandle h, double load)
548 extern "C" void LDQueryEstLoad(LDHandle bdb)
552 extern "C" int LDMemusage(LDHandle _db)
554 LBDB *const db = (LBDB*)(_db.handle);
559 extern "C" int LDProcessorSpeed() { return 1; }
560 #endif // CMK_LBDB_ON
562 bool LDOMidEqual(const LDOMid &i1, const LDOMid &i2)
564 return i1.id == i2.id?true:false;
567 bool LDObjIDEqual(const LDObjid &i1, const LDObjid &i2)
569 return (i1.id[0] == i2.id[0]
570 && i1.id[1] == i2.id[1] && i1.id[2] == i2.id[2]
571 && i1.id[3] == i2.id[3]);