all load balancers inherit from BaseLB now.
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 6 Feb 2002 06:40:49 +0000 (06:40 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 6 Feb 2002 06:40:49 +0000 (06:40 +0000)
NullLB now is created as default, and it will check if another LB is created and be silent.
use thisProxy and CBase new syntax.

18 files changed:
src/ck-ldb/BaseLB.C [new file with mode: 0644]
src/ck-ldb/BaseLB.ci [new file with mode: 0644]
src/ck-ldb/BaseLB.h [new file with mode: 0644]
src/ck-ldb/CentralLB.C
src/ck-ldb/CentralLB.ci
src/ck-ldb/CentralLB.h
src/ck-ldb/EveryLB.ci
src/ck-ldb/LBDatabase.C
src/ck-ldb/Makefile_lb.sh
src/ck-ldb/NborBaseLB.C
src/ck-ldb/NborBaseLB.ci
src/ck-ldb/NborBaseLB.h
src/ck-ldb/NullLB.C
src/ck-ldb/NullLB.ci
src/ck-ldb/NullLB.h
src/ck-ldb/WSLB.C
src/ck-ldb/WSLB.ci
src/ck-ldb/WSLB.h

diff --git a/src/ck-ldb/BaseLB.C b/src/ck-ldb/BaseLB.C
new file mode 100644 (file)
index 0000000..8610bcf
--- /dev/null
@@ -0,0 +1,28 @@
+/*****************************************************************************
+ * $Source$
+ * $Author$
+ * $Date$
+ * $Revision$
+ *****************************************************************************/
+
+#include <charm++.h>
+#include <BaseLB.h>
+
+int numLoadBalancers = 0;
+int hasNullLB = 0;
+
+#if CMK_LBDB_ON
+BaseLB::BaseLB() {
+  numLoadBalancers ++;
+  if (numLoadBalancers - hasNullLB > 1)
+    CmiAbort("Error: try to create more than one load balancer strategies!");
+}
+
+void BaseLB::unregister() {
+  theLbdb=CProxy_LBDatabase(lbdb).ckLocalBranch();
+  theLbdb->RemoveLocalBarrierReceiver(receiver);
+  numLoadBalancers --;
+}
+#endif
+
+#include "BaseLB.def.h"
diff --git a/src/ck-ldb/BaseLB.ci b/src/ck-ldb/BaseLB.ci
new file mode 100644 (file)
index 0000000..4e07efb
--- /dev/null
@@ -0,0 +1,10 @@
+module BaseLB {
+
+extern module LBDatabase;
+
+group BaseLB {
+  entry void BaseLB(void);  
+  entry void unregister(void);
+};
+
+};
diff --git a/src/ck-ldb/BaseLB.h b/src/ck-ldb/BaseLB.h
new file mode 100644 (file)
index 0000000..f87c6d3
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef BASELB_H
+#define BASELB_H
+
+#include "LBDatabase.h"
+
+extern int numLoadBalancers;
+extern int hasNullLB;
+
+class BaseLB: public Group
+{
+protected:
+  LBDatabase *theLbdb;
+  LDBarrierReceiver receiver;
+public:
+  BaseLB() ;
+  void unregister(); 
+};
+
+#endif
index 3d44eda53ff7d50b9bc4ab2600bf3ae0d0c8dec2..1f31a54170eea3b9a86ff43bd41256dbf4546a10 100644 (file)
@@ -6,7 +6,6 @@
  *****************************************************************************/
 
 #include <charm++.h>
-#include <LBDatabase.h>
 #include "CentralLB.h"
 #include "CentralLB.def.h"
 
@@ -51,7 +50,6 @@ void CentralLB::staticAtSync(void* data)
 }
 
 CentralLB::CentralLB()
-  :thisproxy(thisgroup)
 {
   mystep = 0;
   //  CkPrintf("Construct in %d\n",CkMyPe());
@@ -97,7 +95,7 @@ void CentralLB::AtSync()
     MigrationDone();
     return;
   }
-  thisproxy [CkMyPe()].ProcessAtSync();
+  thisProxy [CkMyPe()].ProcessAtSync();
 }
 
 void CentralLB::ProcessAtSync()
@@ -144,7 +142,7 @@ void CentralLB::ProcessAtSync()
       msg->next_lb = new_ld_balancer;
   }
 
-  thisproxy [cur_ld_balancer].ReceiveStats(msg);
+  thisProxy [cur_ld_balancer].ReceiveStats(msg);
 }
 
 void CentralLB::Migrated(LDObjHandle h)
@@ -213,7 +211,7 @@ void CentralLB::ReceiveStats(CLBStatsMsg *m)
     migrateMsg->next_lb = new_ld_balancer;
 
 //    CkPrintf("calling recv migration\n");
-    thisproxy.ReceiveMigration(migrateMsg);
+    thisProxy.ReceiveMigration(migrateMsg);
 
     // Zero out data structures for next cycle
     for(int i=0; i < clients; i++) {
@@ -267,7 +265,7 @@ void CentralLB::MigrationDone()
   migrates_expected = -1;
   // Increment to next step
   mystep++;
-  thisproxy [CkMyPe()].ResumeClients();
+  thisProxy [CkMyPe()].ResumeClients();
 }
 
 void CentralLB::ResumeClients()
index 54b843f9d73f42fd831a9b5e315cbf3608242be7..78c579b60e48c5412e74a6bd2d82f23b076f3a6f 100644 (file)
@@ -1,5 +1,6 @@
 module CentralLB {
 
+extern module BaseLB;
 extern module LBDatabase;
 
 readonly CkGroupID loadbalancer;
@@ -12,7 +13,7 @@ message CLBStatsMsg{
 
 message CLBMigrateMsg;
 
-group CentralLB {
+group CentralLB : BaseLB {
   entry void CentralLB(void);  
   entry void ProcessAtSync(void);
   entry void ReceiveStats(CLBStatsMsg*);
index 466e1366b25386a593cac4ef11a4e2caa528a225..4c2b0239b4aba6a927bc325546effbed89e640ba 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef CENTRALLB_H
 #define CENTRALLB_H
 
-#include <LBDatabase.h>
+#include "BaseLB.h"
 #include "CentralLB.decl.h"
 
 extern CkGroupID loadbalancer;
@@ -19,13 +19,12 @@ void set_avail_vector(char * bitmap);
 class CLBStatsMsg;
 class CLBMigrateMsg;
 
-class CentralLB : public Group
+class CentralLB : public CBase_CentralLB
 {
-  CProxy_CentralLB thisproxy;
 public:
   CentralLB();
   ~CentralLB();
-  CentralLB(CkMigrateMessage *m) :thisproxy(thisgroup) {}
+  CentralLB(CkMigrateMessage *m) {}
   static void staticAtSync(void*);
   void AtSync(void); // Everything is at the PE barrier
   void ProcessAtSync(void); // Receive a message from AtSync to avoid
@@ -79,7 +78,6 @@ public:
 protected:
   virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
   virtual CLBMigrateMsg* Strategy(LDStats* stats,int count);
-  LBDatabase* theLbdb;
 
 private:  
 
index f081a1faa93aa96491a26c65405be979739982b1..c7c370475c96ce8ed6b46e4bbbea335f4b53676b 100644 (file)
@@ -9,5 +9,6 @@ module EveryLB {
    extern module NeighborLB;
    extern module GreedyRefLB;
    extern module RandRefLB;
+   extern module WSLB;
    initcall void initEveryLB(void);
 };
index e0d0ed36e75d52bf32557e5d180aef1d4c5e676c..944f9b06e8498228125704a41acd4379b6a0d422 100644 (file)
 #include "LBDatabase.h"
 #include "LBDatabase.def.h"
 
+#include "NullLB.h"
 
 CkGroupID lbdb;
 
 static LBDefaultCreateFn defaultCreate=NULL;
 void LBSetDefaultCreate(LBDefaultCreateFn f)
 {
-       defaultCreate=f;
+  if (defaultCreate) CmiAbort("Error: try to create multiple load balancer strategies!");
+  defaultCreate=f;
 }
 
 class LBDBResgistry {
@@ -69,6 +71,8 @@ LBDBInit::LBDBInit(CkArgMsg *m)
 #if CMK_LBDB_ON
   lbdb = CProxy_LBDatabase::ckNew();
 
+  LBDefaultCreateFn lbFn = defaultCreate;
+
   char *balancer = NULL;
   if (CmiGetArgString(m->argv, "+balancer", &balancer)) {
     LBDefaultCreateFn fn = lbRegistry.search(balancer);
@@ -76,13 +80,13 @@ LBDBInit::LBDBInit(CkArgMsg *m)
       lbRegistry.displayLBs(); 
       CmiAbort("Unknown load balancer!"); 
     }
-    else {
-      if (defaultCreate) CmiAbort("Try to create multiple load balancer.");
-      (fn)();
-    }
+    else  // overwrite defaultCreate.
+      lbFn = fn;
   }
 
-  if (defaultCreate) (defaultCreate)();
+  // NullLB is the default
+  if (!lbFn) lbFn = CreateNullLB;
+  (lbFn)();
 #endif
   delete m;
 }
index 373cca2acc9eaab86068e35e54f6d9de8efe1771..e26ebd7010ca3a97c6cbd0ea0cc01bfbb7abbb88 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 LOADBALANCERS="RandCentLB RecBisectBfLB MetisLB RefineLB CommLB Comm1LB\
-           HeapCentLB NeighborLB GreedyRefLB RandRefLB"
+           HeapCentLB NeighborLB GreedyRefLB RandRefLB WSLB"
 
 out="Makefile_lb"
 
index 15dd5a03859fbb7ca1f8cedbc654619498bcb63e..328d185660e94895ae069611b75d719fbd6c514c 100644 (file)
@@ -9,7 +9,7 @@
 #include <unistd.h>
 #endif
 #include <charm++.h>
-#include <LBDatabase.h>
+#include <BaseLB.h>
 #include "NborBaseLB.h"
 #include "NborBaseLB.def.h"
 
@@ -36,7 +36,7 @@ void NborBaseLB::staticAtSync(void* data)
   me->AtSync();
 }
 
-NborBaseLB::NborBaseLB() :thisproxy(thisgroup)
+NborBaseLB::NborBaseLB()
 {
   mystep = 0;
   theLbdb = CProxy_LBDatabase(lbdb).ckLocalBranch();
@@ -120,10 +120,10 @@ void NborBaseLB::AtSync()
   int i;
   for(i=0; i < num_neighbors()-1; i++) {
     NLBStatsMsg* m2 = (NLBStatsMsg*) CkCopyMsg((void**)&msg);
-    thisproxy [neighbor_pes[i]].ReceiveStats(m2);
+    thisProxy [neighbor_pes[i]].ReceiveStats(m2);
   }
   if (0 < num_neighbors()) {
-    thisproxy [neighbor_pes[i]].ReceiveStats(msg);
+    thisProxy [neighbor_pes[i]].ReceiveStats(msg);
   } else delete msg;
 
   // Tell our own node that we are ready
@@ -254,10 +254,10 @@ void NborBaseLB::ReceiveStats(NLBStatsMsg *m)
     // Now, send migrate messages to neighbors
     for(i=1; i < num_neighbors(); i++) {
       NLBMigrateMsg* m2 = (NLBMigrateMsg*) CkCopyMsg((void**)&migrateMsg);
-      thisproxy [neighbor_pes[i]].ReceiveMigration(m2);
+      thisProxy [neighbor_pes[i]].ReceiveMigration(m2);
     }
     if (0 < num_neighbors())
-      thisproxy [neighbor_pes[0]].ReceiveMigration(migrateMsg);
+      thisProxy [neighbor_pes[0]].ReceiveMigration(migrateMsg);
     else delete migrateMsg;
     
     // Zero out data structures for next cycle
@@ -328,7 +328,7 @@ void NborBaseLB::MigrationDone()
   migrates_expected = -1;
   // Increment to next step
   mystep++;
-  thisproxy [CkMyPe()].ResumeClients();
+  thisProxy [CkMyPe()].ResumeClients();
 }
 
 void NborBaseLB::ResumeClients()
index c08dc1938c84101243b7f1fe71c53d3dd2f2de0a..385c4e66e7fcb524b90d5df3ffb534dbbcbf7741 100644 (file)
@@ -1,6 +1,7 @@
 module NborBaseLB {
 
 extern module LBDatabase;
+extern module BaseLB;
 
 readonly CkGroupID nborBaselb;
 
@@ -11,7 +12,7 @@ message NLBStatsMsg {
 
 message NLBMigrateMsg;
 
-group NborBaseLB {
+group NborBaseLB: BaseLB {
   entry void NborBaseLB(void);  
   entry void ReceiveStats(NLBStatsMsg*);
   entry void ResumeClients(void);
index 77b8954249e4fcf50f87fe6bfc1efd72effe55a3..ea5fc1485c1ebcdc2026e0a6018279ebb78328a1 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef NBORBASELB_H
 #define NBORBASELB_H
 
-#include <LBDatabase.h>
+#include <BaseLB.h>
 #include "NborBaseLB.decl.h"
 
 extern CkGroupID nborBaselb;
@@ -18,12 +18,11 @@ void CreateNborBaseLB();
 class NLBStatsMsg;
 class NLBMigrateMsg;
 
-class NborBaseLB : public Group
+class NborBaseLB : public CBase_NborBaseLB
 {
-  CProxy_NborBaseLB thisproxy;
 public:
   NborBaseLB();
-  NborBaseLB(CkMigrateMessage *m) :thisproxy(thisgroup) {}
+  NborBaseLB(CkMigrateMessage *m) {}
   ~NborBaseLB();
   static void staticAtSync(void*);
   void AtSync(void); // Everything is at the PE barrier
@@ -86,7 +85,6 @@ protected:
 
   int NeighborIndex(int pe);   // return the neighbor array index
 
-  LBDatabase* theLbdb;
   /*
   struct {
     int pe_speed;
index 6c0d1e9a6271f1a40c9914676bebd51750bb4585..2f7f365df2583df84e8fc3746b01f70893a72b3a 100644 (file)
@@ -6,7 +6,7 @@
  *****************************************************************************/
 
 #include <charm++.h>
-#include <LBDatabase.h>
+#include <BaseLB.h>
 #include "NullLB.h"
 
 void CreateNullLB(void)
@@ -23,15 +23,26 @@ static void initNullLB(void) {
 #if CMK_LBDB_ON
 void NullLB::init(void)
 {
-  thisproxy=thisgroup;
+  // if (CkMyPe() == 0) CkPrintf("[%d] NullLB created\n",CkMyPe());
+  hasNullLB = 1;
   theLbdb=CProxy_LBDatabase(lbdb).ckLocalBranch();
-  theLbdb->
+  receiver = theLbdb->
     AddLocalBarrierReceiver((LDBarrierFn)(staticAtSync),
                            (void*)(this));
 }
 
+NullLB::~NullLB()
+{
+  theLbdb=CProxy_LBDatabase(lbdb).ckLocalBranch();
+  theLbdb->RemoveLocalBarrierReceiver(receiver);
+}
+
 void NullLB::staticAtSync(void* data)
 {
+  // if there is other LBs, just return
+  // CmiPrintf("numLoadBalancers = %d\n", numLoadBalancers);
+  if (numLoadBalancers > 1) return;
+
   NullLB *me = (NullLB*)(data);
   me->AtSync();
 }
@@ -42,7 +53,7 @@ void NullLB::AtSync()
   theLbdb->ClearLoads();
   
   //We don't *do* any migrations, so they're already done!
-  thisproxy[CkMyPe()].migrationsDone();
+  thisProxy[CkMyPe()].migrationsDone();
 }
 void NullLB::migrationsDone(void)
 {
index 25ab7c4251ed67af6d0574d6d276bf6a8a771515..6be8ccff4e0abfc17b49dea752120c9d8754a4ff 100644 (file)
@@ -1,9 +1,10 @@
 module NullLB {
 
 extern module LBDatabase;
+extern module BaseLB;
 initcall void initNullLB(void);
 
-group NullLB {
+group NullLB: BaseLB {
   entry void NullLB(void);  
   entry void migrationsDone(void);
 };
index 4eb71c1e3f897dbd39cc127808c6c55ee5713e73..d6c2f2cdf2b6cc80b5adede2bfdbc2f16935df2c 100644 (file)
@@ -8,19 +8,18 @@
 #ifndef __CK_NULLLB_H
 #define __CK_NULLLB_H
 
-#include <LBDatabase.h>
+#include <BaseLB.h>
 #include "NullLB.decl.h"
 
 void CreateNullLB(void);
 
-class NullLB : public Group
+class NullLB : public CBase_NullLB
 {
-  CProxy_NullLB thisproxy;
-  LBDatabase *theLbdb;
   void init(void);
 public:
   NullLB() {init();}
   NullLB(CkMigrateMessage *m) {init();}
+  ~NullLB();
 
   static void staticAtSync(void*);
   void AtSync(void); // Everything is at the PE barrier
index 6c3771cbd9182b3291f313060ae4a23ac975d33d..965f76ffbd124f195f040c1d370fb56111ccdfb7 100644 (file)
@@ -9,7 +9,7 @@
 #include <unistd.h>
 #endif
 #include <charm++.h>
-#include <LBDatabase.h>
+#include <BaseLB.h>
 #include <cklists.h>
 #include "heap.h"
 #include "WSLB.h"
@@ -45,7 +45,7 @@ void WSLB::staticAtSync(void* data)
   me->AtSync();
 }
 
-WSLB::WSLB()  :thisproxy(thisgroup)
+WSLB::WSLB()  
 {
   if (CkMyPe() == 0)
     CkPrintf("[%d] WSLB created\n",CkMyPe());
@@ -127,7 +127,7 @@ void WSLB::AtSync()
 
   WSLBStatsMsg* msg = AssembleStats();
 
-  thisproxy.ReceiveStats(msg,num_neighbors(),neighbor_pes);
+  thisProxy.ReceiveStats(msg,num_neighbors(),neighbor_pes);
 
   // Tell our own node that we are ready
   ReceiveStats((WSLBStatsMsg*)0);
@@ -277,7 +277,7 @@ void WSLB::ReceiveStats(WSLBStatsMsg *m)
     }
     
     // Now, send migrate messages to neighbors
-    thisproxy.ReceiveMigration(migrateMsg,
+    thisProxy.ReceiveMigration(migrateMsg,
        num_neighbors(),neighbor_pes);
     
     // Zero out data structures for next cycle
@@ -348,7 +348,7 @@ void WSLB::MigrationDone()
   migrates_expected = -1;
   // Increment to next step
   mystep++;
-  thisproxy [CkMyPe()].ResumeClients();
+  thisProxy [CkMyPe()].ResumeClients();
 }
 
 void WSLB::ResumeClients()
index 89d4bb522d1c71fa918319b485a51966b54d5f0e..c059cf7554b5d1222284fca5bbadfa31e22f9f67 100644 (file)
@@ -1,13 +1,14 @@
 module WSLB {
 
 extern module LBDatabase;
+extern module BaseLB;
 
 readonly CkGroupID wslb;
 
 message WSLBStatsMsg;
 message WSLBMigrateMsg;
 
-group WSLB {
+group WSLB: BaseLB {
   entry void WSLB(void);  
   entry void ReceiveStats(WSLBStatsMsg*);
   entry void ResumeClients(void);
index 0353d4e338f5f879ab2ccce934f71244bd7ce2c3..e55e16e97fec21404e3de1c51ef4f6c0f44fe092 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef NEIGHBORLB_H
 #define NEIGHBORLB_H
 
-#include <LBDatabase.h>
+#include <BaseLB.h>
 #include "WSLB.decl.h"
 
 void CreateWSLB();
@@ -16,12 +16,11 @@ void CreateWSLB();
 class WSLBStatsMsg;
 class WSLBMigrateMsg;
 
-class WSLB : public Group
+class WSLB : public CBase_WSLB
 {
-  CProxy_WSLB thisproxy;
 public:
   WSLB();
-  WSLB(CkMigrateMessage *m) :thisproxy(thisgroup) {}
+  WSLB(CkMigrateMessage *m) {}
   ~WSLB();
   static void staticAtSync(void*);
   void AtSync(void); // Everything is at the PE barrier
@@ -80,7 +79,6 @@ protected:
       _n[3] = (me + npe - bigstep) % npe;
   };
 
-  LBDatabase* theLbdb;
   struct {
     int proc_speed;
     double total_walltime;