add -balancer for charmc, and -balancer for runtime.
authorGengbin Zheng <gzheng@illinois.edu>
Thu, 13 Dec 2001 03:07:44 +0000 (03:07 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Thu, 13 Dec 2001 03:07:44 +0000 (03:07 +0000)
In LBDatabase, use registry table to maintain all available load balancers.
in all *LB, lbinit don't create load balancer, but register to the LBDatabase instead.

20 files changed:
src/ck-ldb/Comm1LB.C
src/ck-ldb/CommLB.C
src/ck-ldb/EveryLB.C
src/ck-ldb/EveryLB.ci
src/ck-ldb/GreedyRefLB.C
src/ck-ldb/HeapCentLB.C
src/ck-ldb/LBDatabase.C
src/ck-ldb/LBDatabase.h
src/ck-ldb/Makefile_lb.sh
src/ck-ldb/MetisLB.C
src/ck-ldb/NeighborLB.C
src/ck-ldb/NullLB.C
src/ck-ldb/RandCentLB.C
src/ck-ldb/RandRefLB.C
src/ck-ldb/RecBisectBfLB.C
src/ck-ldb/RefineLB.C
src/ck-ldb/WSLB.C
src/ck-ldb/WSLB.ci
src/scripts/Makefile
src/scripts/charmc

index b125e72638d9206a8fb90e6fd9be365614ed5eb3..99087192e21a27d7cfce0e09265fa0dac34ace85 100644 (file)
@@ -27,7 +27,8 @@ void CreateComm1LB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateComm1LB);        
+//        LBSetDefaultCreate(CreateComm1LB);        
+  LBRegisterBalancer("Comm1LB", CreateComm1LB, "another variation of CommLB");
 }
 
 #include "Comm1LB.def.h"
index f99c5a8bc968bcd3f942e35ab5a27c7e6522dc8c..7d00fbc3b3598cf6a3d84d149aceb3ec465dac23 100644 (file)
@@ -23,7 +23,8 @@ void CreateCommLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateCommLB);        
+//        LBSetDefaultCreate(CreateCommLB);        
+  LBRegisterBalancer("CommLB", CreateCommLB, "Greedy with communication");
 }
 
 #include "CommLB.def.h"
index fd5dd0b1869ff8d4309ce211836f247ce3c18db2..0433e549567c29f65797c89b71ee1e8650fe0965 100644 (file)
@@ -12,7 +12,7 @@ static void CreateNoLB(void)
 
 void initEveryLB(void) {
 #if CMK_LBDB_ON
-  LBSetDefaultCreate(CreateNoLB);
+//  LBSetDefaultCreate(CreateNoLB);
 #endif
 }
 
index 85c4e384a29778402a99f96dec09d488b7cf04a1..f081a1faa93aa96491a26c65405be979739982b1 100644 (file)
@@ -7,7 +7,6 @@ module EveryLB {
    extern module Comm1LB;
    extern module HeapCentLB;
    extern module NeighborLB;
-   extern module WSLB;
    extern module GreedyRefLB;
    extern module RandRefLB;
    initcall void initEveryLB(void);
index 121714d0a52ccf41bdabff1f7a13b430674c2f3f..d46037d17d0de0f89270820fc20216b6b1fc9ba7 100644 (file)
@@ -20,7 +20,8 @@ void CreateGreedyRefLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateGreedyRefLB);        
+//        LBSetDefaultCreate(CreateGreedyRefLB);        
+  LBRegisterBalancer("GreedyRefLB", CreateGreedyRefLB, "Apply greedy, then refine");
 }
 
 #include "GreedyRefLB.def.h"
index c0392e1c5392b5576dbe1c858eac62ecc66284e5..554b8b10a514f62f6f0f71a993cfed379e1cd8f1 100644 (file)
@@ -20,7 +20,8 @@ void CreateHeapCentLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateHeapCentLB);        
+//        LBSetDefaultCreate(CreateHeapCentLB);        
+  LBRegisterBalancer("HeapCentLB", CreateHeapCentLB, "Heap Centralized");
 }
 
 #include "HeapCentLB.def.h"
index 79365c377eb00897ce1526c0104906667a7bfbb4..e0d0ed36e75d52bf32557e5d180aef1d4c5e676c 100644 (file)
@@ -24,11 +24,64 @@ void LBSetDefaultCreate(LBDefaultCreateFn f)
        defaultCreate=f;
 }
 
+class LBDBResgistry {
+private:
+  class LBDBEntry {
+  public:
+    const char *name;
+    LBDefaultCreateFn  fn;
+    const char *help;
+
+    LBDBEntry(): name(0), fn(0), help(0) {}
+    LBDBEntry(int) {}
+    LBDBEntry(const char *n, LBDefaultCreateFn f, const char *h):
+      name(n), fn(f), help(h) {};
+  };
+  CkVec<LBDBEntry> lbtables;
+public:
+  void displayLBs()
+  {
+    CmiPrintf("\nAvailable load balancers:\n");
+    for (int i=0; i<lbtables.length(); i++) {
+      CmiPrintf("* %s: %s\n", lbtables[i].name, lbtables[i].help);
+    }
+    CmiPrintf("\n");
+  }
+  void add(const char *name, LBDefaultCreateFn fn, const char *help) {
+    lbtables.push_back(LBDBEntry(name, fn, help));
+  }
+  LBDefaultCreateFn search(const char *name) {
+    for (int i=0; i<lbtables.length(); i++) 
+      if (0==strcmp(name, lbtables[i].name)) return lbtables[i].fn;
+    return NULL;
+  }
+};
+
+static LBDBResgistry  lbRegistry;
+
+void LBRegisterBalancer(const char *name, LBDefaultCreateFn fn, const char *help)
+{
+  lbRegistry.add(name, fn, help);
+}
 
 LBDBInit::LBDBInit(CkArgMsg *m)
 {
 #if CMK_LBDB_ON
   lbdb = CProxy_LBDatabase::ckNew();
+
+  char *balancer = NULL;
+  if (CmiGetArgString(m->argv, "+balancer", &balancer)) {
+    LBDefaultCreateFn fn = lbRegistry.search(balancer);
+    if (!fn) { 
+      lbRegistry.displayLBs(); 
+      CmiAbort("Unknown load balancer!"); 
+    }
+    else {
+      if (defaultCreate) CmiAbort("Try to create multiple load balancer.");
+      (fn)();
+    }
+  }
+
   if (defaultCreate) (defaultCreate)();
 #endif
   delete m;
index 92a4f50428d6cce8618355c45bb6060205eb72c2..55859f6eadb31b7b868ef26f87a908fa1a760004 100644 (file)
@@ -16,6 +16,8 @@ extern CkGroupID lbdb;
 typedef void (*LBDefaultCreateFn)(void);
 void LBSetDefaultCreate(LBDefaultCreateFn f);
 
+void LBRegisterBalancer(const char *, LBDefaultCreateFn, const char *);
+
 class LBDBInit : public Chare {
   public:
     LBDBInit(CkArgMsg*);
index bf755ff1abeebc5757c7b6d9f1b4bfe30e24d819..373cca2acc9eaab86068e35e54f6d9de8efe1771 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 LOADBALANCERS="RandCentLB RecBisectBfLB MetisLB RefineLB CommLB Comm1LB\
-           HeapCentLB NeighborLB WSLB GreedyRefLB RandRefLB"
+           HeapCentLB NeighborLB GreedyRefLB RandRefLB"
 
 out="Makefile_lb"
 
index 6c40f8e833fdbb12a16e06fad55d904d85c2b3ef..ac72ce2fce142aaa43ba1ccb4fd0a345d37f41e0 100644 (file)
@@ -21,7 +21,8 @@ void CreateMetisLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateMetisLB);
+//        LBSetDefaultCreate(CreateMetisLB);
+  LBRegisterBalancer("MetisLB", CreateMetisLB, "Use Metis(tm) to partition object graph");
 }
 
 #include "MetisLB.def.h"
index c7c41ea35a2eaceaf61d48c5ce611feb1fbc02a9..3bddf06e30c3acb7ef4cdfc9b0e71e213c79332e 100644 (file)
@@ -20,7 +20,8 @@ void CreateNeighborLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateNeighborLB);        
+//  LBSetDefaultCreate(CreateNeighborLB);        
+  LBRegisterBalancer("NeighborLB", CreateNeighborLB, "The neighborhood load balancer");
 }
 
 #include "NeighborLB.def.h"
index 6dc7601f1104d99c775a871c762e47dce7ddfd3d..6c0d1e9a6271f1a40c9914676bebd51750bb4585 100644 (file)
@@ -16,7 +16,7 @@ void CreateNullLB(void)
 
 static void initNullLB(void) {
 #if CMK_LBDB_ON
-  LBSetDefaultCreate(CreateNullLB);
+//  LBSetDefaultCreate(CreateNullLB);
 #endif
 }
 
index e63318f4cf49e1621ca52b2fac8258c39c996c3e..06f1fa6c3fe1b115677d2584dadb5031f9895c85 100644 (file)
@@ -21,7 +21,8 @@ void CreateRandCentLB()
 }
 
 static void lbinit(void) {
-       LBSetDefaultCreate(CreateRandCentLB);
+//     LBSetDefaultCreate(CreateRandCentLB);
+  LBRegisterBalancer("RandCentLB", CreateRandCentLB, "Assign objects to processors randomly");
 }
 #include "RandCentLB.def.h"
 
index 8a837886dc21991124b64fd7f6fcfa7a29f0fab7..5810e0f1d4b26d4166e9cb155135124a706b9e37 100644 (file)
@@ -22,7 +22,8 @@ void CreateRandRefLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateRandRefLB);
+//        LBSetDefaultCreate(CreateRandRefLB);
+  LBRegisterBalancer("RandRefLB", CreateRandRefLB, "Apply random, then refine");
 }
 
 #include "RandRefLB.def.h"
index 46cb76776a1671286e4825d97898f35ebbc4af07..ab0100d6e8382402a90c8d06da5e275bba74dda3 100644 (file)
@@ -41,7 +41,8 @@ void CreateRecBisectBfLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateRecBisectBfLB);
+//        LBSetDefaultCreate(CreateRecBisectBfLB);
+  LBRegisterBalancer("RecBisectBfLB", CreateRecBisectBfLB, "Recursive partitioning with Breadth first enumeration");
 }
 
 #include "RecBisectBfLB.def.h"
index ca78c016f46f09432ab7b5217a09f12f43b86632..70613c0dcc7429c1aad9057c7e0f81deaa7590e6 100644 (file)
@@ -20,7 +20,8 @@ void CreateRefineLB()
 }
 
 static void lbinit(void) {
-        LBSetDefaultCreate(CreateRefineLB);        
+//  LBSetDefaultCreate(CreateRefineLB);        
+  LBRegisterBalancer("RefineLB", CreateRefineLB, "Move a very few objects away from most heavily-loaded processor");
 }
 
 #include "RefineLB.def.h"
index 36ec875582dc8e3b6792e4fcca1db8b78616d68b..6c3771cbd9182b3291f313060ae4a23ac975d33d 100644 (file)
@@ -31,10 +31,6 @@ void CreateWSLB()
   wslb = CProxy_WSLB::ckNew();
 }
 
-static void lbinit(void) {
-        LBSetDefaultCreate(CreateWSLB);        
-}
-
 void WSLB::staticMigrated(void* data, LDObjHandle h)
 {
   WSLB *me = (WSLB*)(data);
@@ -51,6 +47,9 @@ void WSLB::staticAtSync(void* data)
 
 WSLB::WSLB()  :thisproxy(thisgroup)
 {
+  if (CkMyPe() == 0)
+    CkPrintf("[%d] WSLB created\n",CkMyPe());
+
   mystep = 0;
   theLbdb = CProxy_LBDatabase(lbdb).ckLocalBranch();
   theLbdb->
index d9c3c32b55971dba2ba5f84a40a5bd4a3a11cd88..89d4bb522d1c71fa918319b485a51966b54d5f0e 100644 (file)
@@ -1,7 +1,6 @@
 module WSLB {
 
 extern module LBDatabase;
-initcall void lbinit(void);
 
 readonly CkGroupID wslb;
 
index c9291164aadc62da9488d0b9bcd7f71956b4099c..eecde0dbdd87f3dda745cca2de0da89a9ede02ec 100644 (file)
@@ -389,7 +389,7 @@ LIBCK_CORE=init.o register.o qd.o ck.o main.o msgalloc.o ckfutures.o \
            debug-message.o cklocation.o ckarray.o ckreduction.o \
            tempo.o waitqd.o LBDatabase.o lbdb.o \
            LBDBManager.o LBComm.o LBObj.o LBMachineUtil.o Refiner.o \
-          CentralLB.o NborBaseLB.o ObjGraph.o graph.o bitvecset.o \
+          CentralLB.o NborBaseLB.o WSLB.o ObjGraph.o graph.o bitvecset.o \
            Set.o heap.o CommLBHeap.o NullLB.o \
           compat_regmm.o
 
@@ -519,6 +519,12 @@ NborBaseLB.decl.h: NborBaseLB.ci charmxi
 NborBaseLB.o: NborBaseLB.C NborBaseLB.decl.h $(CKHEADERS)
        $(CHARMC) -c NborBaseLB.C
 
+WSLB.decl.h: WSLB.ci charmxi
+       $(CHARMC) WSLB.ci
+
+WSLB.o: WSLB.C WSLB.decl.h $(CKHEADERS)
+       $(CHARMC) -c WSLB.C
+
 CommLBHeap.o: CommLBHeap.C $(CKHEADERS)
        $(CHARMC) -c CommLBHeap.C
 
@@ -567,7 +573,6 @@ LOADBALANCERS=\
    $(L)/libmoduleComm1LB.a \
    $(L)/libmoduleHeapCentLB.a \
    $(L)/libmoduleNeighborLB.a \
-   $(L)/libmoduleWSLB.a \
    $(L)/libmoduleGreedyRefLB.a \
    $(L)/libmoduleRandRefLB.a 
 
@@ -643,15 +648,6 @@ NeighborLB.o: NeighborLB.C NeighborLB.decl.h $(CKHEADERS)
 $(L)/libmoduleNeighborLB.a: NeighborLB.o
        $(CHARMC) -o $(L)/libmoduleNeighborLB.a NeighborLB.o
 
-WSLB.decl.h: WSLB.ci charmxi
-       $(CHARMC) WSLB.ci
-
-WSLB.o: WSLB.C WSLB.decl.h $(CKHEADERS)
-       $(CHARMC) -c WSLB.C
-
-$(L)/libmoduleWSLB.a: WSLB.o
-       $(CHARMC) -o $(L)/libmoduleWSLB.a WSLB.o
-
 GreedyRefLB.decl.h: GreedyRefLB.ci charmxi
        $(CHARMC) GreedyRefLB.ci
 
@@ -679,7 +675,6 @@ LB_OBJ=EveryLB.o \
     Comm1LB.o \
     HeapCentLB.o \
     NeighborLB.o \
-    WSLB.o \
     GreedyRefLB.o \
     RandRefLB.o 
 
index e3bc3a22989211b6c6e7176f7dacd3ffd021781c..01bfc78fbdb52cc27bd83e189012f1689b4bb10c 100755 (executable)
@@ -55,6 +55,7 @@ PRE_LIBRARIES=""
 COPIES=""        
 MODCOPIES=""        
 MODULES=""
+BALANCER=""
 FILES=""       
 OBJECTFILES=""  
 DELETE=""    
@@ -174,6 +175,18 @@ Debug() {
     fi
 }
 
+AddModules() {
+    for M in $*
+    do
+      OK=1
+      for i in `echo $MODULES`
+      do
+        test "$M" = "$i" && OK=0
+      done
+      test $OK = 1 && MODULES="$MODULES $M"
+    done
+}
+
 # TEMP_BASE is appended with this script's process ID (PID),
 # so multiple charmcs can run in parallel without overwriting
 # each other's temporary files.
@@ -211,7 +224,15 @@ do
                ;;
 
        "-module"|"-modules")
-               MODULES="$MODULES `echo $1 | sed -e 's/,/ /g'`"
+#              MODULES="$MODULES `echo $1 | sed -e 's/,/ /g'`"
+               AddModules `echo $1 | sed -e 's/,/ /g'`
+               shift
+               ;;
+
+       "-balancer")
+                test -n "$BALANCER" && Abort "More than one -balancer specified!"
+               BALANCER="$1"
+               AddModules $1
                shift
                ;;
 
@@ -934,6 +955,7 @@ modInitName="moduleinit"
 modInitSrc="$modInitName.C"
 modInitObj="$modInitName.o"
 DoNoErrCheck $RM $modInitSrc $modInitObj > /dev/null 2>&1
+echo "#include \"charm++.h\"" >> $modInitSrc
 for module in $MODULES; do
     echo "extern void _register$module(void);" >> $modInitSrc
 done
@@ -942,8 +964,14 @@ for module in $MODULES; do
     [ -n "$VERBOSE" ] && echo "Adding registration for module $module"
     echo "  _register$module();" >> $modInitSrc
 done
+if test -n "$BALANCER"
+then
+    echo 
+    echo "  extern void Create$BALANCER();" >> $modInitSrc
+    echo "  LBSetDefaultCreate(Create$BALANCER);" >> $modInitSrc
+fi
 echo "}" >> $modInitSrc
-Do $CMK_CXX $OPTSC $OPTS_CXX -c $modInitSrc -o $modInitObj
+Do $CMK_CXX $OPTSC -I$CHARMINC $OPTS_CXX -c $modInitSrc -o $modInitObj
 
 ###############################################################################
 #