Example Jacobi2D SDAG: Clean up control flow
authorPhil Miller <mille121@illinois.edu>
Wed, 15 Dec 2010 16:30:35 +0000 (10:30 -0600)
committerPhil Miller <mille121@illinois.edu>
Wed, 15 Dec 2010 16:30:35 +0000 (10:30 -0600)
examples/charm++/jacobi2d-sdag/jacobi2d.C
examples/charm++/jacobi2d-sdag/jacobi2d.ci

index 89fd63f85e7d56b0e3bb77e30a178739e8e8392f..4b0b88a1de4f84421b1837471965533e0bb96c77 100644 (file)
@@ -102,43 +102,36 @@ public:
     array = CProxy_Jacobi::ckNew(num_chare_x, num_chare_y);
       
     // initiate computation
-    array.doStep();
+    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)
+    if (iterations == WARM_ITER) {
       startTime = CmiWallTimer();
-    array.doStep();
+      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) 
-      {
-       CkPrintf("boo Difference %.10g Satisfied Threshhold %.10g in %d Iterations\n", maxdifference,THRESHHOLD,iterations);
-       done(true);
-      }
-  }
-
-  // when iteration count met
-  void iterationsDone(CkReductionMsg *msg) {
-    iterations++;
-    delete msg;
-    done(false);
+      done(true);
+    if (iterations > maxiterations)
+      done(false);
   }
 
-  void done(bool success)
-    {
+  void done(bool success) {
       if(success)
        CkPrintf("Difference %.10g Satisfied Threshhold %.10g in %d Iterations\n", maxdifference,THRESHHOLD,iterations);
       else
@@ -146,8 +139,7 @@ public:
       endTime = CmiWallTimer();
       CkPrintf("Time elapsed per iteration: %f\n", (endTime - startTime)/(maxiterations-1-WARM_ITER));
       CkExit();
-    }
-
+  }
 };
 
 /** \class Jacobi
@@ -326,7 +318,7 @@ class Jacobi: public CBase_Jacobi {
   }
 
 
-  void check_and_compute() {
+  void check_and_compute(CkCallback cb, int numSteps) {
     compute_kernel();
 
     double *tmp;
@@ -334,15 +326,10 @@ class Jacobi: public CBase_Jacobi {
     temperature = new_temperature;
     new_temperature = tmp;
     constrainBC();
-    if (iterations <= WARM_ITER)
-      contribute(sizeof(double), &maxdifference, CkReduction::max_double, CkCallback(CkIndex_Main::warmupIter(NULL), mainProxy));
-    else if(iterations >= maxiterations)
-      contribute(sizeof(double), &maxdifference, CkReduction::max_double, CkCallback(CkIndex_Main::iterationsDone(NULL), mainProxy));
-    else
-      {  // nonblocking report 
-       contribute(sizeof(double), &maxdifference, CkReduction::max_double, CkCallback(CkIndex_Main::report(NULL), mainProxy));
-       doStep();
-      }
+
+    contribute(sizeof(double), &maxdifference, CkReduction::max_double, cb);
+    if (numSteps > 1)
+      doStep(cb, numSteps-1);
   }
 
 
index 59205608cff79b15aabfa2520593705176d3c78a..13842625d58869568f809f5c544c24eec6d2912d 100644 (file)
@@ -14,7 +14,6 @@ mainmodule jacobi2d {
   mainchare Main {
     entry Main(CkArgMsg *m);
     entry void report(CkReductionMsg *m);
-    entry void iterationsDone(CkReductionMsg *m);
     entry void done(CkReductionMsg *m);
     entry void warmupIter(CkReductionMsg *m);
   };
@@ -25,7 +24,7 @@ mainmodule jacobi2d {
     entry void receiveGhosts(int iter, int dir, int size,
                              double ghosts[size]);
 
-    entry void doStep() {
+    entry void doStep(CkCallback cb, int numSteps) {
       atomic "begin_iteration" {
        begin_iteration();
       }
@@ -39,7 +38,7 @@ mainmodule jacobi2d {
           }
       }
       atomic "doWork" {
-       check_and_compute();
+       check_and_compute(cb, numSteps);
       }
     };
   };