new feature in LB to allow combination of any mutiple centralized load balancers...
authorGengbin Zheng <gzheng@illinois.edu>
Mon, 27 Oct 2003 21:36:49 +0000 (21:36 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Mon, 27 Oct 2003 21:36:49 +0000 (21:36 +0000)
26 files changed:
src/ck-ldb/BaseLB.h
src/ck-ldb/CentralLB.C
src/ck-ldb/CentralLB.ci
src/ck-ldb/CentralLB.h
src/ck-ldb/ComboCentLB.C [new file with mode: 0644]
src/ck-ldb/ComboCentLB.ci [new file with mode: 0644]
src/ck-ldb/ComboCentLB.h [new file with mode: 0644]
src/ck-ldb/Comm1LB.C
src/ck-ldb/DummyLB.C
src/ck-ldb/GreedyCommLB.C
src/ck-ldb/GreedyLB.C
src/ck-ldb/GreedyRefLB.C
src/ck-ldb/LBDatabase.C
src/ck-ldb/LBDatabase.h
src/ck-ldb/MetisLB.C
src/ck-ldb/MetisLB.h
src/ck-ldb/NborBaseLB.C
src/ck-ldb/NeighborLB.C
src/ck-ldb/NullLB.C
src/ck-ldb/NullLB.h
src/ck-ldb/OrbLB.C
src/ck-ldb/RandCentLB.C
src/ck-ldb/RandRefLB.C
src/ck-ldb/RecBisectBfLB.C
src/ck-ldb/RefineCommLB.C
src/ck-ldb/RefineLB.C

index 2447881975cd81240929294069c00edfc9ff0db0..efac0746466c2733a62e5408936065b6aac847db 100644 (file)
@@ -63,11 +63,20 @@ public:
   double * expectedLoad;
 };
 
+#if CMK_LBDB_ON
 #define CreateLBFunc_Def(x)            \
 void Create##x(void) {         \
   int seqno = LBDatabaseObj()->getLoadbalancerTicket();        \
   CProxy_##x::ckNew(CkLBOptions(seqno));       \
+}      \
+BaseLB *Allocate##x(void) { \
+  return new x((CkMigrateMessage*)NULL);       \
 }
+#else          /* CMK_LBDB_ON */
+#define CreateLBFunc_Def(x)    \
+void Create##x(void) {}        \
+BaseLB *Allocate##x(void) { return NULL; }
+#endif
 
 #endif
 
index 68468e623501a3971e4e9150faca8a634a80ebef..b0272328a953e16a44c99b58bcab986b884c1b4a 100644 (file)
@@ -13,7 +13,6 @@
 #include <charm++.h>
 #include "envelope.h"
 #include "CentralLB.h"
-#include "CentralLB.def.h"
 #include "LBDBManager.h"
 #include "LBSimulation.h"
 
@@ -23,16 +22,22 @@ CkGroupID loadbalancer;
 int * lb_ptr;
 int load_balancer_created;
 
-#if CMK_LBDB_ON
+CreateLBFunc_Def(CentralLB);
+
+static void lbinit(void) {
+  LBRegisterBalancer("CentralLB", CreateCentralLB, AllocateCentralLB, "CentralLB base class");
+}
 
 static void getPredictedLoad(CentralLB::LDStats* stats, int count, 
                             LBMigrateMsg *, double *peLoads, 
                             double &, double &, int considerComm);
 
+/*
 void CreateCentralLB()
 {
   CProxy_CentralLB::ckNew(0);
 }
+*/
 
 void CentralLB::staticStartLB(void* data)
 {
@@ -54,6 +59,7 @@ void CentralLB::staticAtSync(void* data)
 
 CentralLB::CentralLB(const CkLBOptions &opt): BaseLB(opt)
 {
+#if CMK_LBDB_ON
   lbname = "CentralLB";
   thisProxy = CProxy_CentralLB(thisgroup);
   //  CkPrintf("Construct in %d\n",CkMyPe());
@@ -86,40 +92,48 @@ CentralLB::CentralLB(const CkLBOptions &opt): BaseLB(opt)
   theLbdb->CollectStatsOn();
 
   load_balancer_created = 1;
+#endif
 }
 
 CentralLB::~CentralLB()
 {
+#if CMK_LBDB_ON
   CkPrintf("Going away\n");
   delete [] statsMsgsList;
   theLbdb->getLBDB()->
     RemoveNotifyMigrated(notifier);
   theLbdb->
     RemoveStartLBFn((LDStartLBFn)(staticStartLB));
+#endif
 }
 
 void CentralLB::turnOn() 
 {
+#if CMK_LBDB_ON
   theLbdb->getLBDB()->
     TurnOnBarrierReceiver(receiver);
   theLbdb->getLBDB()->
     TurnOnNotifyMigrated(notifier);
   theLbdb->getLBDB()->
     TurnOnStartLBFn(startLbFnHdl);
+#endif
 }
 
 void CentralLB::turnOff() 
 {
+#if CMK_LBDB_ON
   theLbdb->getLBDB()->
     TurnOffBarrierReceiver(receiver);
   theLbdb->getLBDB()->
     TurnOffNotifyMigrated(notifier);
   theLbdb->getLBDB()->
     TurnOffStartLBFn(startLbFnHdl);
+#endif
 }
 
 void CentralLB::AtSync()
 {
+#if CMK_LBDB_ON
   DEBUGF(("[%d] CentralLB At Sync step %d!!!!\n",CkMyPe(),mystep));
 
   // if num of processor is only 1, nothing should happen
@@ -128,10 +142,12 @@ void CentralLB::AtSync()
     return;
   }
   thisProxy [CkMyPe()].ProcessAtSync();
+#endif
 }
 
 void CentralLB::ProcessAtSync()
 {
+#if CMK_LBDB_ON
   if (CkMyPe() == cur_ld_balancer) {
     start_lb_time = CmiWallTimer();
   }
@@ -170,16 +186,19 @@ void CentralLB::ProcessAtSync()
   }
 
   thisProxy[cur_ld_balancer].ReceiveStats(msg);
+#endif
 }
 
 void CentralLB::Migrated(LDObjHandle h)
 {
+#if CMK_LBDB_ON
   migrates_completed++;
   //  CkPrintf("[%d] An object migrated! %d %d\n",
   //      CkMyPe(),migrates_completed,migrates_expected);
   if (migrates_completed == migrates_expected) {
     MigrationDone(1);
   }
+#endif
 }
 
 // build data from buffered msg
@@ -219,6 +238,7 @@ void CentralLB::buildStats()
 
 void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
 {
+#if CMK_LBDB_ON
   CLBStatsMsg *m = (CLBStatsMsg *)msg.getMessage();
   int proc;
   const int pe = m->from_pe;
@@ -304,12 +324,13 @@ void CentralLB::ReceiveStats(CkMarshalledCLBStatsMessage &msg)
 //    double strat_end_time = CmiWallTimer();
 //    CkPrintf("Strat elapsed time %f\n",strat_end_time-strat_start_time);
   }
-
+#endif
 }
 
 // test if sender and receiver in a commData is nonmigratable.
 static int isMigratable(LDObjData **objData, int *len, int count, const LDCommData &commData)
 {
+#if CMK_LBDB_ON
   for (int pe=0 ; pe<count; pe++)
   {
     for (int i=0; i<len[pe]; i++)
@@ -317,6 +338,7 @@ static int isMigratable(LDObjData **objData, int *len, int count, const LDCommDa
           LDObjIDEqual(objData[pe][i].objID(), commData.receiver.get_destObj().objID())) 
       return 0;
   }
+#endif
   return 1;
 }
 
@@ -374,10 +396,12 @@ void CentralLB::removeNonMigratable(LDStats* stats, int count)
   delete [] nonmig;
   delete [] lens;
 }
+
 #endif
 
 void CentralLB::ReceiveMigration(LBMigrateMsg *m)
 {
+#if CMK_LBDB_ON
   int i;
   for (i=0; i<CkNumPes(); i++) theLbdb->lastLBInfo.expectedLoad[i] = m->expectedLoad[i];
   
@@ -408,11 +432,13 @@ void CentralLB::ReceiveMigration(LBMigrateMsg *m)
   if (migrates_expected == 0 || migrates_completed == migrates_expected)
     MigrationDone(1);
   delete m;
+#endif
 }
 
 
 void CentralLB::MigrationDone(int balancing)
 {
+#if CMK_LBDB_ON
   if (balancing && _lb_debug && CkMyPe() == cur_ld_balancer) {
     double end_lb_time = CmiWallTimer();
       CkPrintf("[%s] Load balancing step %d finished at %f\n",
@@ -429,24 +455,33 @@ void CentralLB::MigrationDone(int balancing)
   // Increment to next step
   theLbdb->incStep();
   thisProxy [CkMyPe()].ResumeClients(balancing);
+#endif
 }
 
 void CentralLB::ResumeClients(int balancing)
 {
+#if CMK_LBDB_ON
   DEBUGF(("Resuming clients on PE %d\n",CkMyPe()));
   theLbdb->ResumeClients();
+  // switch to the next load balancer in the list
   if (balancing) theLbdb->nextLoadbalancer(seqno);
+#endif
 }
 
 // default load balancing strategy
 LBMigrateMsg* CentralLB::Strategy(LDStats* stats,int count)
 {
+#if CMK_LBDB_ON
   work(stats, count);
   return createMigrateMsg(stats, count);
+#else
+  return NULL;
+#endif
 }
 
 void CentralLB::work(LDStats* stats,int count)
 {
+#if CMK_LBDB_ON
   int i;
   for(int pe=0; pe < count; pe++) {
     struct ProcStats &proc = stats->procs[pe];
@@ -493,6 +528,7 @@ void CentralLB::work(LDStats* stats,int count)
       CkPrintf("     messages = %d\n",cdata[i].messages);
       CkPrintf("        bytes = %d\n",cdata[i].bytes);
     }
+#endif
 }
 
 // generate migrate message from stats->from_proc and to_proc
@@ -611,8 +647,9 @@ void CentralLB::simulationRead() {
   CkExit();
 }
 
-void CentralLB::readStatsMsgs(const char* filename) {
-
+void CentralLB::readStatsMsgs(const char* filename) 
+{
+#if CMK_LBDB_ON
   int i;
   FILE *f = fopen(filename, "r");
   if (f==NULL) {
@@ -649,10 +686,12 @@ void CentralLB::readStatsMsgs(const char* filename) {
 
   // file f is closed in the destructor of PUP::fromDisk
   CmiPrintf("ReadStatsMsg from %s completed\n", filename);
+#endif
 }
 
-void CentralLB::writeStatsMsgs(const char* filename) {
-
+void CentralLB::writeStatsMsgs(const char* filename) 
+{
+#if CMK_LBDB_ON
   FILE *f = fopen(filename, "w");
   if (f==NULL) {
     CmiPrintf("Fatal Error> writeStatsMsgs failed to open the output file %s!\n", filename);
@@ -669,6 +708,7 @@ void CentralLB::writeStatsMsgs(const char* filename) {
   fclose(f);
 
   CmiPrintf("WriteStatsMsgs to %s succeed!\n", filename);
+#endif
 }
 
 // calculate the predicted wallclock/cpu load for every processors
@@ -678,6 +718,7 @@ static void getPredictedLoad(CentralLB::LDStats* stats, int count,
                              double &minObjLoad, double &maxObjLoad,
                             int considerComm)
 {
+#if CMK_LBDB_ON
         int i, pe;
 
         minObjLoad = 1.0e20;   // I suppose no object load is beyond this
@@ -758,6 +799,7 @@ static void getPredictedLoad(CentralLB::LDStats* stats, int count,
          delete [] byteRecvCount;
          delete [] byteSentCount;
        }
+#endif
 }
 
 void CentralLB::findSimResults(LDStats* stats, int count, LBMigrateMsg* msg, LBSimulation* simResults)
@@ -816,6 +858,7 @@ void CentralLB::LDStats::deleteCommHash() {
 
 int CentralLB::LDStats::getHash(const LDObjid &oid, const LDOMid &mid)
 {
+#if CMK_LBDB_ON
     CmiAssert(hashSize > 0);
     int hash = ObjKey(oid, hashSize);
 
@@ -827,6 +870,7 @@ int CentralLB::LDStats::getHash(const LDObjid &oid, const LDOMid &mid)
             return objHash[index];
     }
     //  CkPrintf("not found \n");
+#endif
     return -1;
 }
 
@@ -948,6 +992,6 @@ void CkMarshalledCLBStatsMessage::pup(PUP::er &p)
   msg->pup(p);
 }
 
-#endif
+#include "CentralLB.def.h"
 
 /*@}*/
index a1bef54805e302d26e982a9fed037713ba641b33..841d6f4b8adba068279ea9233b4d0ecf91b3f26b 100644 (file)
@@ -9,6 +9,8 @@ readonly CkGroupID loadbalancer;
 
 //message CLBStatsMsg;
 
+initnode void lbinit(void);
+
 group [migratable] CentralLB : BaseLB {
   entry void CentralLB(const CkLBOptions &);  
   entry void ProcessAtSync(void);
index 03b52c39fc9de4ae6669d46b04522fb83ac29ca2..ebb45a658251be358cc1e911d6112e975e3f032e 100644 (file)
@@ -128,12 +128,12 @@ public:
   void readStatsMsgs(const char* filename);
   void writeStatsMsgs(const char* filename);
 
-protected:
-  virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
-  virtual CmiBool QueryDumpData() { return CmiFalse; };  
   virtual LBMigrateMsg* Strategy(LDStats* stats,int count);
   virtual void work(LDStats* stats,int count);
   virtual LBMigrateMsg * createMigrateMsg(LDStats* stats,int count);
+protected:
+  virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
+  virtual CmiBool QueryDumpData() { return CmiFalse; };  
 
   void simulationRead();
   void simulationWrite();
diff --git a/src/ck-ldb/ComboCentLB.C b/src/ck-ldb/ComboCentLB.C
new file mode 100644 (file)
index 0000000..a831332
--- /dev/null
@@ -0,0 +1,76 @@
+/*****************************************************************************
+ * $Source$
+ * $Author$
+ * $Date$
+ * $Revision$
+ *****************************************************************************/
+
+/**
+ * \addtogroup CkLdb
+*/
+/*@{*/
+
+/*
+Status:
+  * support nonmigratable attrib
+  * does not support processor avail bitvector
+*/
+
+#include <charm++.h>
+
+#if CMK_LBDB_ON
+
+#include "ComboCentLB.h"
+
+extern LBAllocFn getLBAllocFn(char *lbname);
+
+CreateLBFunc_Def(ComboCentLB);
+
+static void lbinit(void) {
+  LBRegisterBalancer("ComboCentLB", 
+                    CreateComboCentLB, 
+                    AllocateComboCentLB, 
+                    "Allow multiple strategies to work serially");
+}
+
+ComboCentLB::ComboCentLB(const CkLBOptions &opt): CentralLB(opt)
+{
+  lbname = "ComboCentLB";
+  const char *lbs = theLbdb->loadbalancer(opt.getSeqNo());
+  if (CkMyPe() == 0)
+    CkPrintf("[%d] ComboCentLB created with %s\n",CkMyPe(), lbs);
+  
+  char *lbcopy = strdup(lbs);
+  char *p = strchr(lbcopy, ':');
+  if (p==NULL) return;
+  p = strtok(p+1, ",");
+  while (p) {
+    LBAllocFn fn = getLBAllocFn(p);
+    if (fn == NULL) {
+      CkPrintf("LB> Invalid load balancer: %s.\n", p);
+      CmiAbort("");
+    }
+    BaseLB *alb = fn();
+    clbs.push_back((CentralLB*)alb);
+    p = strtok(NULL, ",");
+  }
+}
+
+void ComboCentLB::work(CentralLB::LDStats* stats, int count)
+{
+  int nlbs = clbs.length();
+  for (int i=0; i<nlbs; i++) {
+    clbs[i]->work(stats, count);
+    if (i!=nlbs-1) {
+      for (int obj=0; obj<stats->n_objs; obj++) 
+        stats->from_proc[obj] = stats->to_proc[obj];
+    }
+  }
+}
+
+#include "ComboCentLB.def.h"
+
+#endif
+
+
+/*@}*/
diff --git a/src/ck-ldb/ComboCentLB.ci b/src/ck-ldb/ComboCentLB.ci
new file mode 100644 (file)
index 0000000..a779479
--- /dev/null
@@ -0,0 +1,9 @@
+module ComboCentLB {
+
+extern module CentralLB;
+initnode void lbinit(void);
+group [migratable] ComboCentLB : CentralLB {
+  entry void ComboCentLB(const CkLBOptions &);  
+};
+
+};
diff --git a/src/ck-ldb/ComboCentLB.h b/src/ck-ldb/ComboCentLB.h
new file mode 100644 (file)
index 0000000..fba9334
--- /dev/null
@@ -0,0 +1,43 @@
+/*****************************************************************************
+ * $Source$
+ * $Author$
+ * $Date$
+ * $Revision$
+ *****************************************************************************/
+
+/**
+ * \addtogroup CkLdb
+*/
+/*@{*/
+
+#ifndef CENTRALCOMBOLB_H
+#define CENTRALCOMBOLB_H
+
+#include "CentralLB.h"
+#include "ComboCentLB.decl.h"
+
+void CreateComboCentLB();
+
+/// for backward compatibility
+typedef LBMigrateMsg  CLBMigrateMsg;
+
+class ComboCentLB : public CentralLB
+{
+public:
+  ComboCentLB(const CkLBOptions &);
+  ComboCentLB(CkMigrateMessage *m):CentralLB(m) {}
+
+protected:
+  virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
+  virtual void work(LDStats* stats,int count);
+
+private:  
+//  CProxy_CentralLB thisProxy;
+  CkVec<CentralLB *>  clbs;
+};
+
+#endif /* CENTRALCOMBOLB_H */
+
+/*@}*/
+
+
index 1ac2345970e37afdf63729f4206031537c36470e..cf6486913bc330f1a922ef3dbd5cba136d7f3d92 100644 (file)
@@ -24,8 +24,6 @@
 #include <charm++.h>
 #include <stdio.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "Comm1LB.h"
 CreateLBFunc_Def(Comm1LB);
 
 static void lbinit(void) {
-  LBRegisterBalancer("Comm1LB", CreateComm1LB, "another variation of CommLB");
+  LBRegisterBalancer("Comm1LB", 
+                     CreateComm1LB, 
+                     AllocateComm1LB, 
+                    "another variation of CommLB");
 }
 
 #include "Comm1LB.def.h"
@@ -270,8 +271,6 @@ void Comm1LB::work(CentralLB::LDStats* stats, int count)
 }
 
 
-#endif
-
 /*@}*/
 
 
index 8535f6ea5bf773c80598c25f0f457e7ee6324070..2d75d53f4568a21e4f778be8a64351094a2bc550 100644 (file)
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "DummyLB.h"
 
-
 CreateLBFunc_Def(DummyLB);
 
 static void lbinit(void) {
-  LBRegisterBalancer("DummyLB", CreateDummyLB, "Dummy load balancer, like a normal one but with empty strategy");
+  LBRegisterBalancer("DummyLB", CreateDummyLB, AllocateDummyLB, "Dummy load balancer, like a normal one but with empty strategy");
 }
 
 #include "DummyLB.def.h"
 
 DummyLB::DummyLB(const CkLBOptions &opt): CentralLB(opt)
 {
-  lbname = "DummyLB";
+  lbname = (char*)"DummyLB";
   if (CkMyPe() == 0)
     CkPrintf("[%d] DummyLB created\n",CkMyPe());
 }
@@ -37,7 +34,6 @@ CmiBool DummyLB::QueryBalanceNow(int _step)
   return CmiTrue;
 }
 
-#endif
 
 
 /*@}*/
index 425b0871c9279af8ce3910ad082cd0527cd71161..e533c545d4feb9c2b8393eaf525af7859bc2eeb8 100644 (file)
@@ -23,8 +23,6 @@ Status:
 #include <charm++.h>
 #include <stdio.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "GreedyCommLB.h"
@@ -35,7 +33,10 @@ Status:
 CreateLBFunc_Def(GreedyCommLB);
 
 static void lbinit(void) {
-  LBRegisterBalancer("GreedyCommLB", CreateGreedyCommLB, "Greedy algorithm which takes communication graph into account");
+  LBRegisterBalancer("GreedyCommLB", 
+                    CreateGreedyCommLB, 
+                    AllocateGreedyCommLB, 
+                    "Greedy algorithm which takes communication graph into account");
 }
 
 #include "GreedyCommLB.def.h"
@@ -44,14 +45,14 @@ static void lbinit(void) {
 
 GreedyCommLB::GreedyCommLB(const CkLBOptions &opt): CentralLB(opt)
 {
-    lbname = "GreedyCommLB";
+    lbname = (char*)"GreedyCommLB";
     if (CkMyPe() == 0)
        CkPrintf("[%d] GreedyCommLB created\n",CkMyPe());
     manager_init();
 }
 
 GreedyCommLB::GreedyCommLB(CkMigrateMessage *m):CentralLB(m) {
-    lbname = "GreedyCommLB";
+    lbname = (char*)"GreedyCommLB";
     manager_init();
 }
 
@@ -299,7 +300,5 @@ void GreedyCommLB::work(CentralLB::LDStats* _stats, int count)
 }
 
 
-#endif
-
 /*@}*/
 
index 8dda528c56ef83854f2ca0fdeb94d0d1b18a128e..ca6418895a82a5a307da6a6559019963fd4afdd4 100644 (file)
@@ -18,7 +18,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
 
 #include "cklists.h"
 #include "GreedyLB.h"
 CreateLBFunc_Def(GreedyLB);
 
 static void lbinit(void) {
-  LBRegisterBalancer("GreedyLB", CreateGreedyLB, "always assign the heaviest obj onto lightest loaded processor.");
+  LBRegisterBalancer("GreedyLB", 
+                     CreateGreedyLB, 
+                     AllocateGreedyLB, 
+                     "always assign the heaviest obj onto lightest loaded processor.");
 }
 
 #include "GreedyLB.def.h"
@@ -196,7 +198,7 @@ void GreedyLB::work(CentralLB::LDStats* stats, int count)
   HeapData *cpuData = BuildCpuArray(stats, count, &heapSize);
   HeapData *objData = BuildObjectArray(stats, count, &objCount);
 
-  //  CkPrintf("[%d] GreedyLB strategy\n",CkMyPe());
+  if (_lb_debug) CkPrintf("In GreedyLB strategy\n",CkMyPe());
 
   heapSize--;
   for (obj=0; obj < objCount; obj++) {
@@ -237,8 +239,6 @@ void GreedyLB::work(CentralLB::LDStats* stats, int count)
 }
 
 
-#endif
-
 
 /*@}*/
 
index 702b36f8c0b1d6aba26966372cc3815f3168a4bd..46e53b0de4937150b711380ead5151118f0c4bac 100644 (file)
@@ -12,8 +12,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 #include "GreedyRefLB.h"
 
@@ -21,14 +19,17 @@ CreateLBFunc_Def(GreedyRefLB);
 
 static void lbinit(void) {
 //        LBSetDefaultCreate(CreateGreedyRefLB);        
-  LBRegisterBalancer("GreedyRefLB", CreateGreedyRefLB, "Apply greedy, then refine");
+  LBRegisterBalancer("GreedyRefLB", 
+                     CreateGreedyRefLB, 
+                     AllocateGreedyRefLB, 
+                     "Apply greedy, then refine");
 }
 
 #include "GreedyRefLB.def.h"
 
 GreedyRefLB::GreedyRefLB(const CkLBOptions &opt): GreedyLB(opt)
 {
-  lbname = "GreedyRefLB";
+  lbname = (char*)"GreedyRefLB";
   if (CkMyPe()==0)
     CkPrintf("[%d] GreedyRefLB created\n",CkMyPe());
 }
@@ -62,6 +63,5 @@ void GreedyRefLB::work(CentralLB::LDStats* stats, int count)
   Refiner::FreeProcs(to_procs);
 }
 
-#endif
 
 /*@}*/
index 3c008a499ab7cef03b3f822bd898af842888f0d3..80627b3d3fd92157d730a71e255e61757adcd8b7 100644 (file)
@@ -33,25 +33,28 @@ double _autoLbPeriod = 1.0;         // in seconds
 int _lb_debug=0;
 int _lb_ignoreBgLoad=0;
 
-class LBDBResgistry {
+// registry class stores all load balancers linked and created at runtime
+class LBDBRegistry {
 friend class LBDBInit;
+friend class LBDatabase;
 private:
   // table for all available LBs linked in
   struct LBDBEntry {
     const char *name;
-    LBCreateFn  fn;
+    LBCreateFn  cfn;
+    LBAllocFn   afn;
     const char *help;
     int        shown;          // if 0, donot show in help page
-    LBDBEntry(): name(0), fn(0), help(0), shown(1) {}
+    LBDBEntry(): name(0), cfn(0), afn(0), help(0), shown(1) {}
     LBDBEntry(int) {}
-    LBDBEntry(const char *n, LBCreateFn f, const char *h, int show=1):
-      name(n), fn(f), help(h), shown(show) {};
+    LBDBEntry(const char *n, LBCreateFn cf, LBAllocFn af, const char *h, int show=1):
+      name(n), cfn(cf), afn(af), help(h), shown(show) {};
   };
   CkVec<LBDBEntry> lbtables;           // a list of available LBs linked
   CkVec<const char *>   compile_lbs;   // load balancers at compile time
   CkVec<const char *>   runtime_lbs;   // load balancers at run time
 public:
-  LBDBResgistry() {}
+  LBDBRegistry() {}
   void displayLBs()
   {
     CmiPrintf("\nAvailable load balancers:\n");
@@ -61,8 +64,8 @@ public:
     }
     CmiPrintf("\n");
   }
-  void addEntry(const char *name, LBCreateFn fn, const char *help, int shown) {
-    lbtables.push_back(LBDBEntry(name, fn, help, shown));
+  void addEntry(const char *name, LBCreateFn fn, LBAllocFn afn, const char *help, int shown) {
+    lbtables.push_back(LBDBEntry(name, fn, afn, help, shown));
   }
   void addCompiletimeBalancer(const char *name) {
     compile_lbs.push_back(name); 
@@ -71,13 +74,22 @@ public:
     runtime_lbs.push_back(name); 
   }
   LBCreateFn search(const char *name) {
+    char *ptr = strpbrk((char *)name, ":,");
+    int slen = ptr-name;
     for (int i=0; i<lbtables.length(); i++)
-      if (0==strcmp(name, lbtables[i].name)) return lbtables[i].fn;
+      if (0==strncmp(name, lbtables[i].name, slen)) return lbtables[i].cfn;
+    return NULL;
+  }
+  LBAllocFn getLBAllocFn(const char *name) {
+    char *ptr = strpbrk((char *)name, ":,");
+    int slen = ptr-name;
+    for (int i=0; i<lbtables.length(); i++)
+      if (0==strncmp(name, lbtables[i].name, slen)) return lbtables[i].afn;
     return NULL;
   }
 };
 
-static LBDBResgistry lbRegistry;
+static LBDBRegistry lbRegistry;
 
 void LBDefaultCreate(const char *lbname)
 {
@@ -85,9 +97,13 @@ void LBDefaultCreate(const char *lbname)
 }
 
 // default is to show the helper
-void LBRegisterBalancer(const char *name, LBCreateFn fn, const char *help, int shown)
+void LBRegisterBalancer(const char *name, LBCreateFn fn, LBAllocFn afn, const char *help, int shown)
 {
-  lbRegistry.addEntry(name, fn, help, shown);
+  lbRegistry.addEntry(name, fn, afn, help, shown);
+}
+
+LBAllocFn getLBAllocFn(char *lbname) {
+    return lbRegistry.getLBAllocFn(lbname);
 }
 
 // create a load balancer group using the strategy name
@@ -245,6 +261,9 @@ void LBDatabase::set_avail_vector(char * bitmap, int new_ld){
     }
 }
 
+// called in CreateFooLB() when multiple load balancers are created
+// on PE0, BaseLB of each load balancer applies a ticket number
+// and broadcast the ticket number to all processors
 int LBDatabase::getLoadbalancerTicket()  { 
   int seq = nloadbalancers;
   nloadbalancers ++;
@@ -280,6 +299,20 @@ void LBDatabase::nextLoadbalancer(int seq) {
   }
 }
 
+// return the seq-th load balancer string name of
+// it can be specified in either compile time or runtime
+// runtime has higher priority
+const char *LBDatabase::loadbalancer(int seq) {
+  if (lbRegistry.runtime_lbs.length()) {
+    CmiAssert(seq < lbRegistry.runtime_lbs.length());
+    return lbRegistry.runtime_lbs[seq];
+  }
+  else {
+    CmiAssert(seq < lbRegistry.compile_lbs.length());
+    return lbRegistry.compile_lbs[seq];
+  }
+}
+
 /*
   callable from user's code
 */
index 3930b9dc5eac90255f01c31215b6c2a6e709b255..e30a8e32e7f6a073e11c92fa7a461e5febd9f17d 100644 (file)
@@ -41,9 +41,10 @@ extern int _lb_debug;
 extern int _lb_ignoreBgLoad;
 
 typedef void (*LBCreateFn)();
+typedef BaseLB * (*LBAllocFn)();
 void LBDefaultCreate(LBCreateFn f);
 
-void LBRegisterBalancer(const char *, LBCreateFn, const char *, int shown=1);
+void LBRegisterBalancer(const char *, LBCreateFn, LBAllocFn, const char *, int shown=1);
 
 void _LBDBInit();
 
@@ -214,6 +215,7 @@ public:
   int getLoadbalancerTicket();
   void addLoadbalancer(BaseLB *lb, int seq);
   void nextLoadbalancer(int seq);
+  const char *loadbalancer(int seq);
 
   inline int step() { return mystep; }
   inline void incStep() { mystep++; }
index 47931d9898c24a97d68cdc52a22a6d30e2281c5a..2096ff352c16d1470b27d8cf9e0dcc3c196df868 100644 (file)
@@ -12,8 +12,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "MetisLB.h"
@@ -22,7 +20,7 @@ CreateLBFunc_Def(MetisLB);
 
 static void lbinit(void) {
 //        LBSetDefaultCreate(CreateMetisLB);
-  LBRegisterBalancer("MetisLB", CreateMetisLB, "Use Metis(tm) to partition object graph");
+  LBRegisterBalancer("MetisLB", CreateMetisLB, AllocateMetisLB, "Use Metis(tm) to partition object graph");
 }
 
 #include "MetisLB.def.h"
@@ -34,12 +32,6 @@ MetisLB::MetisLB(const CkLBOptions &opt): CentralLB(opt)
     CkPrintf("[%d] MetisLB created\n",CkMyPe());
 }
 
-CmiBool MetisLB::QueryBalanceNow(int _step)
-{
-  // CkPrintf("[%d] Balancing on step %d\n",CkMyPe(),_step);
-  return CmiTrue;
-}
-
 static void printStats(int count, int numobjs, double *cputimes, 
                        int **comm, int *map)
 {
@@ -98,10 +90,7 @@ extern "C" void METIS_mCPartGraphRecursive(int*, int*, int*, int*, int*, int*,
 extern "C" void METIS_mCPartGraphKway(int*, int*, int*, int*, int*, int*,
                                     int*, int*, int*, int*, int*,
                                     int*, int*);
-/*
-LBMigrateMsg* MetisLB::Strategy(CentralLB::LDStats* stats, int count,
-                                int option=0)
-*/
+
 void MetisLB::work(CentralLB::LDStats* stats, int count)
 {
   // CkPrintf("entering MetisLB::Strategy...\n");
@@ -305,6 +294,4 @@ void MetisLB::work(CentralLB::LDStats* stats, int count)
     delete[] newmap;
 }
 
-#endif
-
 /*@}*/
index 5f295dda7b14d62e159a1ccff0f3ffbfaba17411..ef22fab28759e554424533ddbc55d12d3a17b090 100644 (file)
@@ -23,7 +23,7 @@ public:
   MetisLB(const CkLBOptions &);
   MetisLB(CkMigrateMessage *m):CentralLB(m) {}
 private:
-  CmiBool QueryBalanceNow(int step);
+  CmiBool QueryBalanceNow(int step) { return CmiTrue; }
   void work(CentralLB::LDStats* stats, int count);
 };
 
index b8c000ab3de76aadd4d0aec6c47c1e2d6f4a7e9c..e5c0d30b2777b22c27bb6f0cfef7d860656d27e5 100644 (file)
@@ -18,8 +18,6 @@
 #include "NborBaseLB.h"
 #include "NborBaseLB.def.h"
 
-#if CMK_LBDB_ON
-
 //CreateLBFunc_Def(NborBaseLB);
 
 void NborBaseLB::staticMigrated(void* data, LDObjHandle h)
@@ -38,7 +36,8 @@ void NborBaseLB::staticAtSync(void* data)
 
 NborBaseLB::NborBaseLB(const CkLBOptions &opt): BaseLB(opt)
 {
-  lbname = "NborBaseLB";
+#if CMK_LBDB_ON
+  lbname = (char *)"NborBaseLB";
   mystep = 0;
   thisProxy = CProxy_NborBaseLB(thisgroup);
   theLbdb->
@@ -73,6 +72,7 @@ NborBaseLB::NborBaseLB(const CkLBOptions &opt): BaseLB(opt)
   receive_stats_ready = 0;
 
   theLbdb->CollectStatsOn();
+#endif
 }
 
 NborBaseLB::~NborBaseLB()
@@ -100,6 +100,7 @@ void NborBaseLB::FindNeighbors()
 
 void NborBaseLB::AtSync()
 {
+#if CMK_LBDB_ON
   //  CkPrintf("[%d] NborBaseLB At Sync step %d!!!!\n",CkMyPe(),mystep);
 
   if (neighbor_pes == 0) FindNeighbors();
@@ -131,10 +132,12 @@ void NborBaseLB::AtSync()
   // Tell our own node that we are ready
   CkMarshalledNLBStatsMessage mmsg(NULL);
   ReceiveStats(mmsg);
+#endif
 }
 
 NLBStatsMsg* NborBaseLB::AssembleStats()
 {
+#if CMK_LBDB_ON
   // Get stats
   theLbdb->TotalTime(&myStats.total_walltime,&myStats.total_cputime);
   theLbdb->IdleTime(&myStats.idletime);
@@ -187,6 +190,9 @@ NLBStatsMsg* NborBaseLB::AssembleStats()
   //  CkPrintf("PE %d sending %d to ReceiveStats %d objs, %d comm\n",
   //      CkMyPe(),msg->serial,msg->n_objs,msg->n_comm);
   return msg;
+#else
+  return NULL;
+#endif
 }
 
 void NborBaseLB::Migrated(LDObjHandle h)
@@ -201,6 +207,7 @@ void NborBaseLB::Migrated(LDObjHandle h)
 
 void NborBaseLB::ReceiveStats(CkMarshalledNLBStatsMessage &data)
 {
+#if CMK_LBDB_ON
   NLBStatsMsg *m = data.getMessage();
   if (neighbor_pes == 0) FindNeighbors();
 
@@ -278,11 +285,12 @@ void NborBaseLB::ReceiveStats(CkMarshalledNLBStatsMessage &data)
         CkPrintf("Strat elapsed time %f\n",strat_end_time-strat_start_time);
     }
   }
-  
+#endif  
 }
 
 void NborBaseLB::ReceiveMigration(LBMigrateMsg *msg)
 {
+#if CMK_LBDB_ON
   if (neighbor_pes == 0) FindNeighbors();
 
   if (mig_msgs_received == 0) migrates_expected = 0;
@@ -319,11 +327,13 @@ void NborBaseLB::ReceiveMigration(LBMigrateMsg *msg)
   mig_msgs_received = 0;
   if (migrates_expected == 0 || migrates_expected == migrates_completed)
     MigrationDone();
+#endif
 }
 
 
 void NborBaseLB::MigrationDone()
 {
+#if CMK_LBDB_ON
   if (CkMyPe() == 0 && start_lb_time != 0.0) {
     double end_lb_time = CmiWallTimer();
     if (_lb_debug)
@@ -335,11 +345,14 @@ void NborBaseLB::MigrationDone()
   // Increment to next step
   mystep++;
   thisProxy [CkMyPe()].ResumeClients();
+#endif
 }
 
 void NborBaseLB::ResumeClients()
 {
+#if CMK_LBDB_ON
   theLbdb->ResumeClients();
+#endif
 }
 
 LBMigrateMsg* NborBaseLB::Strategy(LDStats* stats,int count)
@@ -419,7 +432,5 @@ void CkMarshalledNLBStatsMessage::pup(PUP::er &p)
 }
 
 
-#endif
-
 
 /*@{*/
index c4f11d4f3effdc25a343d7656a6fb2cd9bc6a939..5b7f4dd7e4689b16c28ba44ba9ca41f53184370b 100644 (file)
@@ -12,8 +12,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "heap.h"
@@ -23,7 +21,10 @@ CreateLBFunc_Def(NeighborLB);
 
 static void lbinit(void) {
 //  LBSetDefaultCreate(CreateNeighborLB);        
-  LBRegisterBalancer("NeighborLB", CreateNeighborLB, "The neighborhood load balancer");
+  LBRegisterBalancer("NeighborLB", 
+                     CreateNeighborLB, 
+                     AllocateNeighborLB, 
+                     "The neighborhood load balancer");
 }
 
 #include "NeighborLB.def.h"
@@ -37,6 +38,7 @@ NeighborLB::NeighborLB(const CkLBOptions &opt):NborBaseLB(opt)
 
 LBMigrateMsg* NeighborLB::Strategy(NborBaseLB::LDStats* stats, int count)
 {
+#if CMK_LBDB_ON
   //  CkPrintf("[%d] Strategy starting\n",CkMyPe());
   // Compute the average load to see if we are overloaded relative
   // to our neighbors
@@ -172,8 +174,10 @@ LBMigrateMsg* NeighborLB::Strategy(NborBaseLB::LDStats* stats, int count)
   }
 
   return msg;
+#else
+  return NULL;
+#endif
 };
 
-#endif
 
 /*@}*/
index 43fb9d15e56166fdcbcf09b3a7f47a0d4355c4ef..d321d832e267cd86ae568a3b58b5783d4b8f4e4f 100644 (file)
@@ -24,7 +24,7 @@ void CreateNullLB(void) {
 }
 
 static void lbinit(void) {
-  LBRegisterBalancer("NullLB", CreateNullLB, "should not be shown", 0);
+  LBRegisterBalancer("NullLB", CreateNullLB, NULL, "should not be shown", 0);
 }
 
 #if CMK_LBDB_ON
index 13affb15f319588a042520d58b3297956b1c6847..12d6f1461c82a8a38fb401526b28dea058001b5b 100644 (file)
@@ -25,9 +25,9 @@ class NullLB : public BaseLB
 {
 public:
   NullLB(const CkLBOptions &opt): BaseLB(opt) 
-       {init(); lbname="NullLB";}
+       {init(); lbname=(char*)"NullLB";}
   NullLB(CkMigrateMessage *m):BaseLB(m) 
-       {init(); lbname="NullLB";}
+       {init(); lbname=(char*)"NullLB";}
   ~NullLB();
 
   static void staticAtSync(void*);
index edcd9fb76c4115997f83ee95a6c6f8c08aa279ec..637757323ba4e1c33737322cc9331bae2307f5e1 100644 (file)
@@ -15,8 +15,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "OrbLB.h"
@@ -26,7 +24,7 @@
 CreateLBFunc_Def(OrbLB);
 
 static void lbinit(void) {
-  LBRegisterBalancer("OrbLB", CreateOrbLB, "partition objects based on coordinates");
+  LBRegisterBalancer("OrbLB", CreateOrbLB, AllocateOrbLB, "partition objects based on coordinates");
 }
 
 #include "OrbLB.def.h"
@@ -265,6 +263,7 @@ void OrbLB::mapPartitionsToNodes()
 
 void OrbLB::work(CentralLB::LDStats* stats, int count)
 {
+#if CMK_LBDB_ON
   int i,j;
 
   P = count;
@@ -391,10 +390,10 @@ void OrbLB::work(CentralLB::LDStats* stats, int count)
   delete [] partitions;
 
   CmiPrintf("OrbLB finished time: %f\n", CmiWallTimer() - t);
+#endif
 }
 
 
-#endif
 
 
 /*@}*/
index 5614f79ffe1e5bc0ca117274323b7a6d45bbfa21..26a11aa2179170431f2f0c44faac4d0e10ce852a 100644 (file)
@@ -18,8 +18,6 @@ Status:
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "RandCentLB.h"
@@ -27,8 +25,9 @@ Status:
 CreateLBFunc_Def(RandCentLB);
 
 static void lbinit(void) {
-  LBRegisterBalancer("RandCentLB", CreateRandCentLB, "Assign objects to processors randomly");
+  LBRegisterBalancer("RandCentLB", CreateRandCentLB, AllocateRandCentLB, "Assign objects to processors randomly");
 }
+
 #include "RandCentLB.def.h"
 
 RandCentLB::RandCentLB(const CkLBOptions &opt): CentralLB(opt)
@@ -59,7 +58,5 @@ void RandCentLB::work(CentralLB::LDStats* stats, int count)
   }
 }
 
-#endif
-
 
 /*@}*/
index 0365c821a31133b11e931499d45f5e9768cceb26..b4b40b9ee49ab9c09d37f8ff24fff030b1f2713b 100644 (file)
@@ -12,8 +12,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 #include "Refiner.h"
 
@@ -23,14 +21,14 @@ CreateLBFunc_Def(RandRefLB);
 
 static void lbinit(void) {
 //        LBSetDefaultCreate(CreateRandRefLB);
-  LBRegisterBalancer("RandRefLB", CreateRandRefLB, "Apply random, then refine");
+  LBRegisterBalancer("RandRefLB", CreateRandRefLB, AllocateRandRefLB, "Apply random, then refine");
 }
 
 #include "RandRefLB.def.h"
 
 RandRefLB::RandRefLB(const CkLBOptions &opt): RandCentLB(opt)
 {
-  lbname = "RandRefLB";
+  lbname = (char *)"RandRefLB";
   if (CkMyPe() == 0)
     CkPrintf("[%d] RandRefLB created\n",CkMyPe());
 }
@@ -66,7 +64,5 @@ void RandRefLB::work(CentralLB::LDStats* stats, int count)
   Refiner::FreeProcs(to_procs);
 };
 
-#endif
-
 
 /*@}*/
index 6e6f2718547b3a838efa1975760e34614bfedab1..9dbaeaa9ceb2a755d5580577703d1036a3520bee 100644 (file)
@@ -22,8 +22,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "RecBisectBfLB.h"
 
 extern "C" {
@@ -52,14 +50,14 @@ CreateLBFunc_Def(RecBisectBfLB);
 
 static void lbinit(void) {
 //        LBSetDefaultCreate(CreateRecBisectBfLB);
-  LBRegisterBalancer("RecBisectBfLB", CreateRecBisectBfLB, "Recursive partitioning with Breadth first enumeration");
+  LBRegisterBalancer("RecBisectBfLB", CreateRecBisectBfLB, AllocateRecBisectBfLB, "Recursive partitioning with Breadth first enumeration");
 }
 
 #include "RecBisectBfLB.def.h"
 
 RecBisectBfLB::RecBisectBfLB(const CkLBOptions &opt): CentralLB(opt)
 {
-  lbname = "RecBisectBfLB";
+  lbname = (char*)"RecBisectBfLB";
   if (CkMyPe() == 0)
     CkPrintf("[%d] RecBisectBfLB created\n",CkMyPe());
 }
@@ -334,7 +332,5 @@ void RecBisectBfLB::recursivePartition(int numParts, Graph *g,
   }  
 }
 
-#endif
-
 
 /*@}*/
index 73a08ef98bf8d6f2eb7d5d4444ca590bded6ced4..187e8b4b538b8fcefa6182bd82482348110f823c 100644 (file)
@@ -12,8 +12,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "RefineCommLB.h"
@@ -23,6 +21,7 @@ CreateLBFunc_Def(RefineCommLB);
 static void lbinit(void) {
   LBRegisterBalancer("RefineCommLB", 
                      CreateRefineCommLB, 
+                     AllocateRefineCommLB, 
                      "Average load among processors by moving objects away from overloaded processor, communication aware");
 }
 
@@ -30,7 +29,7 @@ static void lbinit(void) {
 
 RefineCommLB::RefineCommLB(const CkLBOptions &opt): RefineLB(opt)
 {
-  lbname = "RefineCommLB";
+  lbname = (char *)"RefineCommLB";
   if (CkMyPe() == 0)
     CkPrintf("[%d] RefineCommLB created\n",CkMyPe());
 }
@@ -42,6 +41,7 @@ CmiBool RefineCommLB::QueryBalanceNow(int _step)
 
 void RefineCommLB::work(CentralLB::LDStats* stats, int count)
 {
+#if CMK_LBDB_ON
   int obj;
   //  CkPrintf("[%d] RefineLB strategy\n",CkMyPe());
 
@@ -74,9 +74,8 @@ void RefineCommLB::work(CentralLB::LDStats* stats, int count)
   // Free the refine buffers
   RefinerComm::FreeProcs(from_procs);
   RefinerComm::FreeProcs(to_procs);
-};
-
 #endif
+};
 
 
 /*@}*/
index c0fa5bfdfc83b2d83584e299e7eeb0b57772c359..3711175bd1e7dde68b312a3aaeb3aa7fb3870878 100644 (file)
@@ -12,8 +12,6 @@
 
 #include <charm++.h>
 
-#if CMK_LBDB_ON
-
 #include "cklists.h"
 
 #include "RefineLB.h"
 CreateLBFunc_Def(RefineLB);
 
 static void lbinit(void) {
-  LBRegisterBalancer("RefineLB", CreateRefineLB, "Move objects away from overloaded processor to reach average");
+  LBRegisterBalancer("RefineLB", 
+                     CreateRefineLB, 
+                     AllocateRefineLB, 
+                     "Move objects away from overloaded processor to reach average");
 }
 
 #include "RefineLB.def.h"
 
 RefineLB::RefineLB(const CkLBOptions &opt): CentralLB(opt)
 {
-  lbname = "RefineLB";
+  lbname = (char *)"RefineLB";
   if (CkMyPe() == 0)
     CkPrintf("[%d] RefineLB created\n",CkMyPe());
 }
 
-CmiBool RefineLB::QueryBalanceNow(int _step)
-{
-  return CmiTrue;
-}
-
 void RefineLB::work(CentralLB::LDStats* stats, int count)
 {
   int obj;
@@ -74,7 +70,4 @@ void RefineLB::work(CentralLB::LDStats* stats, int count)
   Refiner::FreeProcs(to_procs);
 };
 
-#endif
-
-
 /*@}*/