optimizations
authorAbhinav Bhatele <bhatele@illinois.edu>
Wed, 3 Jun 2009 23:07:45 +0000 (23:07 +0000)
committerAbhinav Bhatele <bhatele@illinois.edu>
Wed, 3 Jun 2009 23:07:45 +0000 (23:07 +0000)
examples/bigsim/sdag/jacobi3d/Makefile
examples/bigsim/sdag/jacobi3d/jacobi3d.C

index 29564501fd6e093422f3480099cfca1938cac5a2..b9d0bfba4676e3ca3511061b4cfc38b31e9ec610 100644 (file)
@@ -1,4 +1,4 @@
-OPTS   = -O3 -DUSE_TOPOMAP=1
+OPTS   = -O3 -DUSE_TOPOMAP=0
 CHARMC = ../../../../bin/charmc $(OPTS)
 
 OBJS = jacobi3d.o
index 956e0283190cdcad5f3b45fa69188fec9886ae36..fa2d5347e099953c16390e77832b8577c6aaef15 100644 (file)
@@ -274,20 +274,6 @@ class Jacobi: public CBase_Jacobi {
       constrainBC();
     }
 
-    // Enforce some boundary conditions
-    void constrainBC() {
-        // Heat left, top and front faces of each chare's block
-       for(int i=1; i<blockDimX+1; ++i)
-         for(int k=1; k<blockDimZ+1; ++k)
-            temperature[index(i, 1, k)] = 255.0;
-        for(int j=1; j<blockDimY+1; ++j)
-         for(int k=1; k<blockDimZ+1; ++k)
-            temperature[index(1, j, k)] = 255.0;
-       for(int i=1; i<blockDimX+1; ++i)
-          for(int j=1; j<blockDimY+1; ++j)
-            temperature[index(i, j, 1)] = 255.0;
-    }
-
     // a necessary function which we ignore now
     // if we were to use load balancing and migration
     // this function might become useful
@@ -318,6 +304,7 @@ class Jacobi: public CBase_Jacobi {
           CkPrintf("Start of iteration %d\n", iterations);
           BgPrintf("BgPrint> Start of iteration at %f\n");
       }
+      iterations++;
 
       // Copy different faces into messages
       ghostMsg *leftMsg = new (blockDimY*blockDimZ) ghostMsg(RIGHT, blockDimY, blockDimZ);
@@ -421,8 +408,23 @@ class Jacobi: public CBase_Jacobi {
        arrived_bottom--;
        arrived_front--;
        arrived_back--;
+
        compute_kernel();
-       iterations++;
+
+       // calculate error
+       // not being done right now since we are doing a fixed no. of iterations
+
+#if USE_3D_ARRAYS
+       double ***tmp;
+#else
+       double *tmp;
+#endif
+       tmp = temperature;
+        temperature = new_temperature;
+        new_temperature = tmp;
+
+       constrainBC();
+
        if (iterations <= WARM_ITER || iterations >= MAX_ITER)
          contribute(0, 0, CkReduction::concat, CkCallback(CkIndex_Main::report(), mainProxy));
        else
@@ -433,12 +435,6 @@ class Jacobi: public CBase_Jacobi {
     // Check to see if we have received all neighbor values yet
     // If all neighbor values have been received, we update our values and proceed
     void compute_kernel() {
-      // We must create a new array for these values because we don't want to 
-      // update any of the values in temperature[][] array until using them first.
-      // Other schemes could be used to accomplish this same problem. We just put
-      // the new values in a temporary array and write them to temperature[][] 
-      // after all of the new values are computed.
-
 #pragma unroll    
       for(int i=1; i<blockDimX+1; ++i) {
        for(int j=1; j<blockDimY+1; ++j) {
@@ -454,15 +450,20 @@ class Jacobi: public CBase_Jacobi {
          }
        }
       }
+    }
 
-#pragma unroll
-      for(int i=0;i<blockDimX+2;++i)
-       for(int j=0;j<blockDimY+2;++j)
-         for(int k=1; k<blockDimZ+1; ++k)
-             temperature[index(i, j, k)] = new_temperature[index(i, j, k)];
-
-      // Enforce the boundary conditions again
-      constrainBC();
+    // Enforce some boundary conditions
+    void constrainBC() {
+      // Heat left, top and front faces of each chare's block
+      for(int i=1; i<blockDimX+1; ++i)
+       for(int k=1; k<blockDimZ+1; ++k)
+         temperature[index(i, 1, k)] = 255.0;
+      for(int j=1; j<blockDimY+1; ++j)
+       for(int k=1; k<blockDimZ+1; ++k)
+         temperature[index(1, j, k)] = 255.0;
+      for(int i=1; i<blockDimX+1; ++i)
+       for(int j=1; j<blockDimY+1; ++j)
+         temperature[index(i, j, 1)] = 255.0;
     }
 
 };