another way of handling no obj
authorHarshitha <gplkrsh2@illinois.edu>
Fri, 12 Oct 2012 03:54:08 +0000 (22:54 -0500)
committerHarshitha <gplkrsh2@illinois.edu>
Fri, 12 Oct 2012 03:54:08 +0000 (22:54 -0500)
src/ck-ldb/LBDatabase.C
src/ck-ldb/LBDatabase.h
src/ck-ldb/MetaBalancer.C
src/ck-ldb/MetaBalancer.h

index 790829d701e0cb2e5e1dd73dba93456767764136..c5e1630cf40d392e7fc635eea6d10dd36a6b1105 100644 (file)
@@ -500,18 +500,6 @@ void LBDatabase::ResetAdaptive() {
        }
 }
 
-void LBDatabase::DoneRegisteringObjects(LDOMHandle _om) {
-       LDDoneRegisteringObjects(_om);
-#if CMK_LBDB_ON
-       if (metabalancer == NULL) {
-               metabalancer = CProxy_MetaBalancer(_metalb).ckLocalBranch();
-       }
-       if (metabalancer != NULL && getLBDB()->ObjDataCount() == 0) {
-               metabalancer->HandleAdaptiveNoObj();
-       }
-#endif
-}
-
 void LBDatabase::ResumeClients() {
 #if CMK_LBDB_ON
   if (metabalancer == NULL) {
index 2aa5615ec9c900b85c88d17017522e2e3f9e7b69..db6ae222cea1ad3c13a05e66c07056028dcc2d24 100644 (file)
@@ -194,7 +194,10 @@ public:
     LDRegisteringObjects(_om);
   };
 
-  void DoneRegisteringObjects(LDOMHandle _om);
+  inline void DoneRegisteringObjects(LDOMHandle _om) {
+    LDDoneRegisteringObjects(_om);
+  };
+
   void ResetAdaptive();
 
   inline LDObjHandle RegisterObj(LDOMHandle h, LDObjid id,
index 116c926369ab5cf7292aeec4cb31e49af06ebdd2..483a35c96a1c965309e971c6faba77b4d67ae241 100644 (file)
@@ -21,7 +21,8 @@
 #define MIN_STATS 6
 #define STATS_COUNT 8 // The number of stats collected during reduction
 
-#   define DEBAD(x) /*CkPrintf x*/
+#   define DEBAD(x) CkPrintf x
+#   define DEBADDETAIL(x) /*CkPrintf x*/
 #   define EXTRA_FEATURE 0
 
 CkReductionMsg* lbDataCollection(int nMsg, CkReductionMsg** msgs) {
@@ -130,6 +131,7 @@ void MetaBalancer::init(void) {
   lb_in_progress = false;
 
   is_prev_lb_refine = -1;
+  periodicCall((void *) this);
 }
 
 void MetaBalancer::pup(PUP::er& p) {
@@ -163,6 +165,7 @@ void MetaBalancer::ResumeClients() {
     lbdb_no_obj_callback.clear();
     lb_in_progress = false;
   }
+  HandleAdaptiveNoObj();
 }
 
 int MetaBalancer::get_iteration() {
@@ -173,7 +176,7 @@ bool MetaBalancer::AddLoad(int it_n, double load) {
   int index = it_n % VEC_SIZE;
   total_count_vec[index]++;
   adaptive_struct.total_syncs_called++;
-  DEBAD(("At PE %d Total contribution for iteration %d is %d total objs %d\n",
+  DEBADDETAIL(("At PE %d Total contribution for iteration %d is %d total objs %d\n",
       CkMyPe(), it_n, total_count_vec[index],
       lbdatabase->getLBDB()->ObjDataCount()));
 
@@ -330,8 +333,8 @@ void MetaBalancer::ReceiveMinStats(CkReductionMsg *msg) {
       adaptive_struct.doCommStrategy = false;
       adaptive_struct.lb_calculated_period = period;
       adaptive_struct.in_progress = true;
-      CkPrintf("Sticking to the calculated period %d\n",
-        adaptive_struct.lb_calculated_period);
+      DEBAD(("Sticking to the calculated period %d\n",
+        adaptive_struct.lb_calculated_period));
       thisProxy.LoadBalanceDecision(adaptive_struct.lb_msg_send_no++,
         adaptive_struct.lb_calculated_period);
       return;
@@ -449,7 +452,7 @@ bool MetaBalancer::generatePlan(int& period, double& ratio_at_t) {
   max /= adaptive_lbdb.history_data.size();
   avg /= adaptive_lbdb.history_data.size();
   double cost = adaptive_struct.lb_strategy_cost + adaptive_struct.lb_migration_cost;
-  period = (int) cost/(max - avg); 
+  period = (int) (cost/(max - avg));
   DEBAD(("Obtained period %d from constant prediction\n", period));
   if (period < 0) { 
     period = adaptive_struct.final_lb_period;
@@ -469,7 +472,7 @@ bool MetaBalancer::getPeriodForStrategy(double new_load_percent,
   double b = (mc - ac);
   double c = -(adaptive_struct.lb_strategy_cost +
       adaptive_struct.lb_migration_cost) * overhead_percent;
-      CkPrintf("cost %f\n",
+  CkPrintf("cost %f\n",
       (adaptive_struct.lb_strategy_cost+adaptive_struct.lb_migration_cost));
   bool got_period = getPeriodForLinear(a, b, c, period);
   if (!got_period) {
@@ -490,7 +493,7 @@ bool MetaBalancer::getPeriodForStrategy(double new_load_percent,
     }
   }
 
-  int intersection_t = (int) (mc-ac) / (aslope - mslope);
+  int intersection_t = (int) ((mc-ac) / (aslope - mslope));
   if (intersection_t > 0 && period > intersection_t) {
     DEBAD(("Avg | Max Period set when curves intersect\n"));
     return false;
@@ -646,13 +649,25 @@ void MetaBalancer::ResetAdaptive() {
   lb_in_progress = true;
 }
 
+void MetaBalancer::periodicCall(void *ad) {
+  MetaBalancer *s = (MetaBalancer *)ad;
+  CcdCallFnAfterOnPE((CcdVoidFn)checkForNoObj, (void *)s, 1, CkMyPe());
+}
+
+void MetaBalancer::checkForNoObj(void *ad) {
+  MetaBalancer *s = (MetaBalancer *) ad;
+  s->HandleAdaptiveNoObj();
+}
+
 // Called by LBDatabase to indicate that no objs are there in this processor
 void MetaBalancer::HandleAdaptiveNoObj() {
-  adaptive_struct.lb_iteration_no++;
-  DEBAD(("(%d) --HandleAdaptiveNoObj %d\n", CkMyPe(),
-      adaptive_struct.lb_iteration_no));
-  thisProxy[0].RegisterNoObjCallback(CkMyPe());
-  TriggerAdaptiveReduction();
+  if (lbdatabase->getLBDB()->ObjDataCount() == 0) {
+    adaptive_struct.lb_iteration_no++;
+    DEBAD(("(%d) --HandleAdaptiveNoObj %d\n", CkMyPe(),
+          adaptive_struct.lb_iteration_no));
+    thisProxy[0].RegisterNoObjCallback(CkMyPe());
+    TriggerAdaptiveReduction();
+  }
 }
 
 void MetaBalancer::RegisterNoObjCallback(int index) {
@@ -677,23 +692,25 @@ void MetaBalancer::RegisterNoObjCallback(int index) {
 }
 
 void MetaBalancer::TriggerAdaptiveReduction() {
-  adaptive_struct.lb_iteration_no++;
-  double lb_data[STATS_COUNT];
-  lb_data[0] = adaptive_struct.lb_iteration_no;
-  lb_data[1] = 1;
-  lb_data[2] = 0.0;
-  lb_data[3] = 0.0;
-  lb_data[4] = 0.0;
-  lb_data[5] = 0.0;
-  lb_data[6] = 0.0;
-  lb_data[7] = 0.0;
-
-  DEBAD(("[%d] Triggered adaptive reduction for noobj %d\n", CkMyPe(),
-      adaptive_struct.lb_iteration_no));
-
-  CkCallback cb(CkIndex_MetaBalancer::ReceiveMinStats((CkReductionMsg*)NULL),
-      thisProxy[0]);
-  contribute(STATS_COUNT*sizeof(double), lb_data, lbDataCollectionType, cb);
+  if (lbdatabase->getLBDB()->ObjDataCount() == 0) {
+    adaptive_struct.lb_iteration_no++;
+    double lb_data[STATS_COUNT];
+    lb_data[0] = adaptive_struct.lb_iteration_no;
+    lb_data[1] = 1;
+    lb_data[2] = 0.0;
+    lb_data[3] = 0.0;
+    lb_data[4] = 0.0;
+    lb_data[5] = 0.0;
+    lb_data[6] = 0.0;
+    lb_data[7] = 0.0;
+
+    DEBAD(("[%d] Triggered adaptive reduction for noobj %d\n", CkMyPe(),
+          adaptive_struct.lb_iteration_no));
+
+    CkCallback cb(CkIndex_MetaBalancer::ReceiveMinStats((CkReductionMsg*)NULL),
+        thisProxy[0]);
+    contribute(STATS_COUNT*sizeof(double), lb_data, lbDataCollectionType, cb);
+  }
 }
 
 
index 0b894f2cd64460de9e0c1fce761128c520e1e779..3db3de46190d220fc5ceb1b9e13ecab9af65148f 100644 (file)
@@ -60,6 +60,8 @@ public:
   void LoadBalanceDecision(int, int);
   void LoadBalanceDecisionFinal(int, int);
   void ReceiveIterationNo(int, int); // Receives the current iter no
+  static void periodicCall(void *ad);
+  static void checkForNoObj(void *ad);
   void HandleAdaptiveNoObj();
   void RegisterNoObjCallback(int index);
   void TriggerAdaptiveReduction();