Adding a couple of queueing types.
authorEsteban Meneses <emenese2@illinois.edu>
Mon, 13 Jun 2011 16:46:28 +0000 (11:46 -0500)
committerEsteban Meneses <emenese2@illinois.edu>
Mon, 13 Jun 2011 16:46:28 +0000 (11:46 -0500)
doc/charm++/order.tex
tests/charm++/load_balancing/lb_test/Topo.C
tests/charm++/load_balancing/lb_test/Topo.ci
tests/charm++/load_balancing/lb_test/Topo.h
tests/charm++/load_balancing/lb_test/lb_test.C
tests/charm++/load_balancing/lb_test/lb_test.ci

index 755d9b0a49dceb38a519b2212505e544d042bbe2..8797012ac94a7f641b78db909ca6b318014af3d7 100644 (file)
@@ -26,6 +26,8 @@ where \uw{queueingtype} is one of the following constants:
   CK_QUEUEING_ILIFO
   CK_QUEUEING_BFIFO
   CK_QUEUEING_BLIFO
+  CK_QUEUEING_LLIFO
+  CK_QUEUEING_LLIFO
 \end{alltt}
 
 The first two options,  \kw{CK\_QUEUEING\_FIFO} and
index 4ef2618a0e3249ff50c3717b753ba9a0bc2b5ae0..1ea6e839346506459e5b128cdc09aace87ef84c7 100644 (file)
@@ -7,9 +7,12 @@
 
 #include "Topo.h"
 #include "Topo.def.h"
+#include "lb_test.decl.h"
 
 #define LINEARLY_GRADED                            0
 
+/* readonly*/ extern CProxy_main mainProxy;
+
 CkGroupID Topo::Create(const int _elem, const char* _topology, 
                       const int min_us, const int max_us)
 {
@@ -88,6 +91,18 @@ Topo::Topo(TopoInitMsg* _m)
   delete _m;
 }
 
+// Function to change loads in all the elements
+void Topo::shuffleLoad(){
+
+       printf("[%d] At shuffleLoad\n",CkMyPe());
+       
+       // calling function to assign new loads
+       FindComputeTimes();
+
+       // reduction to continue execution
+       contribute(CkCallback(CkIndex_main::resume(),mainProxy));
+}
+
 void Topo::FindComputeTimes()
 {
   int i;
index 3bf0c082079cdc133ccb2b9c0f0b5685b037f4a1..c505cae33c4943265175a9f1b924da27742692b1 100644 (file)
@@ -3,7 +3,8 @@ module Topo {
 message TopoInitMsg;
 
 group Topo {
-  entry Topo(TopoInitMsg*);  
+  entry Topo(TopoInitMsg*); 
+       entry void shuffleLoad(void);
 };
 
-};
\ No newline at end of file
+};
index 70f4da003e400e2ca56dbd43b196ee994d894a7a..4d860a2222c3b4648a48ea061038dc8a8816130e 100644 (file)
@@ -52,6 +52,7 @@ public:
   void SendTo(int index, MsgInfo* who);
   int RecvCount(int index);
   void RecvFrom(int index, MsgInfo* who);
+       void shuffleLoad();
 
 private:
   struct Elem;
index 1ae7d4ba450803fad530a6c14eb2384cb5130c9b..a31f532bd4c38d8b45680a99acda6e9df4070268 100644 (file)
@@ -33,6 +33,8 @@
 #define N_LOADBALANCE 500 /*Times around ring until we load balance*/
 #define DEBUGF(x)       // CmiPrintf x
 
+#define DYNAMIC_IMBALANCE 1
+
 int specialTracing = 0;
 
 void initialize()
@@ -61,6 +63,11 @@ public:
     CkPrintf("All done\n");
     CkExit();
   };
+       void resume(void){
+               CkPrintf("Resuming...\n");
+               lbproxy.ForwardMessages();
+       };
+
 
 private:
   void arg_error(char* argv0);
@@ -116,6 +123,8 @@ main::main(CkArgMsg *m)
   if (topoid.isZero())
     CkAbort("ERROR! Topology not found!  \n");
 
+       // TODO: this code looks wrong, since reduction client is set AFTER array creation,
+       // which, according to Charm++ manual, should be done BEFORE array is created
   lbproxy = CProxy_Lb_array::ckNew(element_count);
   lbproxy.setReductionClient(programBegin, NULL);
 }
@@ -289,7 +298,14 @@ public:
           contribute(0, NULL, CkReduction::sum_int, cb);
 #endif
          loadbalancing = 1;
-       } else ForwardMessages();
+       } 
+#if DYNAMIC_IMBALANCE
+       else if(nTimes > n_loadbalance && (nTimes-(n_loadbalance/2)) % n_loadbalance == 0) {
+               printf("Here at %d\n",nTimes);
+               contribute(CkCallback(CkIndex_Topo::shuffleLoad(),topoid));
+       } 
+#endif
+       else ForwardMessages();
       }
       delete m;
     }
index 04fdc26061bdbb119ca8a702d3438c89828e33b9..fa95c76d76c4478e9a901a5f02b063f6abd0ae95 100644 (file)
@@ -21,6 +21,7 @@ mainmodule lb_test {
   mainchare main {
     entry main();
     entry void maindone(void);
+       entry void resume(void);
   };
 
   array [1D] Lb_array {