communication aware lb strategy
authorHarshitha <gplkrsh2@illinois.edu>
Mon, 26 Mar 2012 21:25:53 +0000 (16:25 -0500)
committerHarshitha <gplkrsh2@illinois.edu>
Mon, 26 Mar 2012 21:25:53 +0000 (16:25 -0500)
examples/charm++/jacobi1d/Makefile
examples/charm++/jacobi1d/jacobi1d.C
src/ck-ldb/AdaptiveLB.C
src/ck-ldb/LBDatabase.C
src/ck-ldb/LBDatabase.h

index 39666c57fe388691f6150225e84c0f76fb2ae23e..823ae6a8d88502ad91734938a361211ddaa2ed04 100644 (file)
@@ -7,7 +7,7 @@ OBJS = jacobi1d.o
 all: jacobi1d
 
 jacobi1d: $(OBJS)
 all: jacobi1d
 
 jacobi1d: $(OBJS)
-       $(CHARMC) -language charm++ -module CommonLBs -o jacobi1d  $(OBJS)
+       $(CHARMC) -language charm++ -module CommonLBs -module AdaptiveLB -module MetisLB -o jacobi1d  $(OBJS)
 
 proj: $(OBJS)
        $(CHARMC) -language charm++ -tracemode projections -o jacobi1d.prj $(OBJS)
 
 proj: $(OBJS)
        $(CHARMC) -language charm++ -tracemode projections -o jacobi1d.prj $(OBJS)
index b43ce61757e0612b1b67521de6abef7e7ac18694..455e83411f5c8f8a166abc1370b6e8cd5cb35a9a 100644 (file)
@@ -34,7 +34,7 @@
 #define wrap_y(a)  (((a)+num_chares)%num_chares)
 #define index(a,b) ((a) + (b)*(blockDimX+2))
 
 #define wrap_y(a)  (((a)+num_chares)%num_chares)
 #define index(a,b) ((a) + (b)*(blockDimX+2))
 
-#define MAX_ITER       26
+#define MAX_ITER       100
 #define WARM_ITER      5
 #define TOP            1
 #define BOTTOM         2
 #define WARM_ITER      5
 #define TOP            1
 #define BOTTOM         2
@@ -133,7 +133,8 @@ class Jacobi: public CBase_Jacobi {
       arrived_bottom = 0;
       iterations = 0;
 
       arrived_bottom = 0;
       iterations = 0;
 
-      work = thisIndex;
+      //work = thisIndex;
+      work = 1;
       constrainBC();
     }
 
       constrainBC();
     }
 
index c75228ac29ac1cbc005e43312cb50784b37fcc08..8660b11b597be4b3576e25c723f2af6da3c13334 100644 (file)
@@ -58,7 +58,7 @@ void AdaptiveLB::work(LDStats* stats)
   ObjGraph *ogr = new ObjGraph(stats);
   CkPrintf("Adaptive work\n");
 
   ObjGraph *ogr = new ObjGraph(stats);
   CkPrintf("Adaptive work\n");
 
-  bool isRefine = theLbdb->isStrategyRefine();
+  bool isComm = theLbdb->isStrategyComm();
 
   // Calculate the load and total messages
   double totalLoad = 0.0;
 
   // Calculate the load and total messages
   double totalLoad = 0.0;
@@ -94,7 +94,7 @@ void AdaptiveLB::work(LDStats* stats)
   // Choose the right LB
   //
   // If communication overhead is 10% computation, then choose Scotch LB
   // Choose the right LB
   //
   // If communication overhead is 10% computation, then choose Scotch LB
-  if (commOverhead > (totalLoad * percent_overhead / 100)) {
+  if (isComm || (commOverhead > (totalLoad * percent_overhead / 100))) {
     metisLB->work(stats);
     CkPrintf("---METIS LB\n");
   } else {
     metisLB->work(stats);
     CkPrintf("---METIS LB\n");
   } else {
index 0949dd23c5ab58ac4340bb8465eaf35f51d7c4c5..27deed0d046ee482bde8e77698926de954cf2ca5 100644 (file)
@@ -40,7 +40,7 @@ struct AdaptiveLBStructure {
   double lb_strategy_cost;
   double lb_migration_cost;
   bool lb_period_informed;
   double lb_strategy_cost;
   double lb_migration_cost;
   bool lb_period_informed;
-  bool isRefine;
+  bool isCommLB;
   int lb_msg_send_no;
   int lb_msg_recv_no;
   int total_syncs_called;
   int lb_msg_send_no;
   int lb_msg_recv_no;
   int total_syncs_called;
@@ -157,7 +157,6 @@ void LBDefaultCreate(const char *lbname)
 // default is to show the helper
 void LBRegisterBalancer(const char *name, LBCreateFn fn, LBAllocFn afn, const char *help, int shown)
 {
 // default is to show the helper
 void LBRegisterBalancer(const char *name, LBCreateFn fn, LBAllocFn afn, const char *help, int shown)
 {
-  CkPrintf("Adding to registr %s \n", name);
   lbRegistry.addEntry(name, fn, afn, help, shown);
 }
 
   lbRegistry.addEntry(name, fn, afn, help, shown);
 }
 
@@ -171,8 +170,6 @@ LBCreateFn getLBCreateFn(const char *lbname) {
 // create a load balancer group using the strategy name
 static void createLoadBalancer(const char *lbname)
 {
 // create a load balancer group using the strategy name
 static void createLoadBalancer(const char *lbname)
 {
-  CkPrintf("Creating load balancer '%s'\n", lbname);
-      lbRegistry.displayLBs();    // display help page
     LBCreateFn fn = lbRegistry.search(lbname);
     if (!fn) {    // invalid lb name
       CmiPrintf("Abort: Unknown load balancer: '%s'!\n", lbname);
     LBCreateFn fn = lbRegistry.search(lbname);
     if (!fn) {    // invalid lb name
       CmiPrintf("Abort: Unknown load balancer: '%s'!\n", lbname);
@@ -596,9 +593,9 @@ bool LBDatabase::AddLoad(int iteration, double load) {
     adaptive_struct.lb_no_iterations = iteration;
   }
   total_load_vec[iteration] += load;
     adaptive_struct.lb_no_iterations = iteration;
   }
   total_load_vec[iteration] += load;
-  if (max_load_vec[iteration] < load) {
-    max_load_vec[iteration] = load;
-  }
// if (max_load_vec[iteration] < load) {
//   max_load_vec[iteration] = load;
// }
   if (total_contrib_vec[iteration] == getLBDB()->ObjDataCount()) {
     double idle_time;
     double tmp;
   if (total_contrib_vec[iteration] == getLBDB()->ObjDataCount()) {
     double idle_time;
     double tmp;
@@ -609,8 +606,10 @@ bool LBDatabase::AddLoad(int iteration, double load) {
     double lb_data[6];
     lb_data[0] = iteration;
     lb_data[1] = total_load_vec[iteration];
     double lb_data[6];
     lb_data[0] = iteration;
     lb_data[1] = total_load_vec[iteration];
-    lb_data[2] = max_load_vec[iteration];
-    lb_data[3] = getLBDB()->ObjDataCount();
+    //lb_data[2] = max_load_vec[iteration];
+    lb_data[2] = total_load_vec[iteration];
+    //lb_data[3] = getLBDB()->ObjDataCount();
+    lb_data[3] = 1;
     lb_data[4] = idle_time;
     lb_data[5] = idle_time;
 
     lb_data[4] = idle_time;
     lb_data[5] = idle_time;
 
@@ -655,7 +654,7 @@ void LBDatabase::ReceiveMinStats(CkReductionMsg *msg) {
   // If the max/avg ratio is greater than the threshold and also this is not the
   // step immediately after load balancing, carry out load balancing
   //if (max/avg >= 1.1 && adaptive_lbdb.history_data.size() > 4) {
   // If the max/avg ratio is greater than the threshold and also this is not the
   // step immediately after load balancing, carry out load balancing
   //if (max/avg >= 1.1 && adaptive_lbdb.history_data.size() > 4) {
-  if ((avg_idle >= 0.1*avg || max/avg >= 1.5) && adaptive_lbdb.history_data.size() > 4) {
+  if ((max_idle >= 0.1*avg || max/avg >= 1.5) && adaptive_lbdb.history_data.size() > 4) {
     CkPrintf("Carry out load balancing step at iter max/avg(%lf) and avg_idle/avg_load (%lf)\n", max/avg, avg_idle/avg);
 //    if (!adaptive_struct.lb_period_informed) {
 //      // Just for testing
     CkPrintf("Carry out load balancing step at iter max/avg(%lf) and avg_idle/avg_load (%lf)\n", max/avg, avg_idle/avg);
 //    if (!adaptive_struct.lb_period_informed) {
 //      // Just for testing
@@ -667,6 +666,13 @@ void LBDatabase::ReceiveMinStats(CkReductionMsg *msg) {
 
     // If the new lb period is less than current set lb period
     if (adaptive_struct.lb_calculated_period > iteration_n + 1) {
 
     // If the new lb period is less than current set lb period
     if (adaptive_struct.lb_calculated_period > iteration_n + 1) {
+      if (max/avg < 1.5) {
+        adaptive_struct.isCommLB = true;
+        CkPrintf("No load imbalance but idle time\n");
+      } else {
+        adaptive_struct.isCommLB = false;
+        CkPrintf("Has load imbalance\n");
+      }
       adaptive_struct.lb_calculated_period = iteration_n + 1;
       adaptive_struct.lb_period_informed = true;
       adaptive_struct.in_progress = true;
       adaptive_struct.lb_calculated_period = iteration_n + 1;
       adaptive_struct.lb_period_informed = true;
       adaptive_struct.in_progress = true;
@@ -916,8 +922,8 @@ int LBDatabase::getPredictedLBPeriod() {
   return adaptive_struct.lb_ideal_period;
 }
 
   return adaptive_struct.lb_ideal_period;
 }
 
-bool LBDatabase::isStrategyRefine() {
-  return adaptive_struct.isRefine;
+bool LBDatabase::isStrategyComm() {
+  return adaptive_struct.isCommLB;
 }
 
 /*
 }
 
 /*
index 0a1cd90c9726179b35fac0e70f4403c733c1610e..73ddd25f22b37a928a46fcafba2cf6eddf9da400 100644 (file)
@@ -368,7 +368,7 @@ public:
   bool getPeriodForStrategy(double new_load, double overhead_percent, int& period);
   int getPredictedLBPeriod();
 
   bool getPeriodForStrategy(double new_load, double overhead_percent, int& period);
   int getPredictedLBPeriod();
 
-  bool isStrategyRefine();
+  bool isStrategyComm();
   void UpdateAfterLBData(int is_lb_refine, double lb_max, double lb_avg) {
     is_prev_lb_refine = is_lb_refine;
     after_lb_avg = lb_avg;
   void UpdateAfterLBData(int is_lb_refine, double lb_max, double lb_avg) {
     is_prev_lb_refine = is_lb_refine;
     after_lb_avg = lb_avg;