Example Jacobi2D SDAG: Consolidate parallel control flow into Main::run()
authorPhil Miller <mille121@illinois.edu>
Wed, 15 Dec 2010 16:47:42 +0000 (10:47 -0600)
committerPhil Miller <mille121@illinois.edu>
Wed, 15 Dec 2010 16:47:42 +0000 (10:47 -0600)
examples/charm++/jacobi2d-sdag/jacobi2d.C
examples/charm++/jacobi2d-sdag/jacobi2d.ci

index 4b0b88a1de4f84421b1837471965533e0bb96c77..e175fd966e7446f34d1ec0a87513938bc2e64d54 100644 (file)
@@ -50,7 +50,9 @@ public:
   CProxy_Jacobi array;
   int iterations;
   double maxdifference;
+  Main_SDAG_CODE;
   Main(CkArgMsg* m) {
+    __sdag_init();
     if ( (m->argc < 3) || (m->argc > 6)) {
       CkPrintf("%s [array_size] [block_size]\n", m->argv[0]);
       CkPrintf("OR %s [array_size] [block_size] maxiterations\n", m->argv[0]);
@@ -100,35 +102,9 @@ public:
       
     // make proxy and populate array in one call
     array = CProxy_Jacobi::ckNew(num_chare_x, num_chare_y);
-      
-    // initiate computation
-    array.doStep(CkCallback(CkIndex_Main::warmupIter(NULL), thisProxy), 1);
-  }
-
-  // Start timer after a few iterations for performance stability
-  void warmupIter(CkReductionMsg *msg) {
-    iterations++;
-    if (iterations == WARM_ITER) {
-      startTime = CmiWallTimer();
-      array.doStep(CkCallback(CkIndex_Main::report(NULL), thisProxy),
-                  maxiterations);
-    } else {
-      array.doStep(CkCallback(CkIndex_Main::warmupIter(NULL), thisProxy),
-                  1);
-    }
-    delete msg;
-  }
 
-  // Each worker reports back to here when it completes an iteration
-  // Asynchronous check on threshhold satisfaction
-  void report(CkReductionMsg *msg) {
-    iterations++;
-    maxdifference=((double *) msg->getData())[0];
-    delete msg;
-    if ( maxdifference - THRESHHOLD<0) 
-      done(true);
-    if (iterations > maxiterations)
-      done(false);
+    // initiate computation
+    thisProxy.run();
   }
 
   void done(bool success) {
index 13842625d58869568f809f5c544c24eec6d2912d..ae9b7fe82de52f74a446e3ff56c8e246616daaa3 100644 (file)
@@ -13,9 +13,35 @@ mainmodule jacobi2d {
 
   mainchare Main {
     entry Main(CkArgMsg *m);
+    entry void run() {
+      while (iterations < WARM_ITER) {
+       atomic {
+         array.doStep(CkCallback(CkIndex_Main::report(NULL), thisProxy), 1);
+       }
+       when report(CkReductionMsg *msg) atomic {
+         iterations++;
+         delete msg;
+       }
+      }
+      atomic "start_timed_portion" {
+       startTime = CmiWallTimer();
+       array.doStep(CkCallback(CkIndex_Main::report(NULL), thisProxy),
+                    maxiterations);
+      }
+      while (iterations < maxiterations) {
+       // Each worker reports back to here when it completes an iteration
+       // Asynchronous check on threshhold satisfaction
+       when report(CkReductionMsg *msg) atomic {
+         iterations++;
+         maxdifference=((double *) msg->getData())[0];
+         delete msg;
+         if (maxdifference - THRESHHOLD < 0)
+           done(true);
+       }
+      }
+      atomic { done(false); }
+    };
     entry void report(CkReductionMsg *m);
-    entry void done(CkReductionMsg *m);
-    entry void warmupIter(CkReductionMsg *m);
   };
 
   array [2D] Jacobi {