tests/charm++/jacobi3d-sdag: adding support for running with OpenMP
authorLukasz Wesolowski <wesolwsk@illinois.edu>
Mon, 9 Jul 2012 23:53:13 +0000 (18:53 -0500)
committerLukasz Wesolowski <wesolwsk@illinois.edu>
Mon, 9 Jul 2012 23:53:13 +0000 (18:53 -0500)
tests/charm++/jacobi3d-sdag/Makefile
tests/charm++/jacobi3d-sdag/jacobi3d.C
tests/charm++/jacobi3d-sdag/jacobi3d.ci

index 1ab7bdf173a5c2c7b7709067f13edd2c918c0339..79735636dd16647084395b9fd0a8745458abacd7 100644 (file)
@@ -2,12 +2,19 @@ CHARMC=../../../bin/charmc $(OPTS) $(MOPTS)
 
 OBJS = jacobi3d.o
 
+OBJS_OMP = jacobi3d_omp.o
+
+OMP_FLAG = -DJACOBI_OPENMP
+
 all: jacobi3d
 
 jacobi3d: $(OBJS)
        $(CHARMC) -language charm++ -module DummyLB -o jacobi3d $(OBJS)
 #      $(CHARMC) -language charm++ -module EveryLB -memory paranoid -o jacobi3d $(OBJS)
 
+jacobi3d_omp: $(OBJS_OMP)
+       $(CHARMC) -language charm++ -module DummyLB -fopenmp -o jacobi3d $(OBJS)
+
 projections: $(OBJS)
        $(CHARMC) -language charm++ -tracemode projections -lz -o jacobi3d.prj $(OBJS)
 
@@ -29,3 +36,7 @@ clean:
 
 jacobi3d.o: jacobi3d.C jacobi3d.decl.h
        $(CHARMC) -c jacobi3d.C
+
+jacobi3d_omp.o: jacobi3d.C jacobi3d.decl.h
+       $(CHARMC) $(OMP_FLAG) -c jacobi3d.C
+
index 174c5e360c0de54256e7468aa0ff081fd8ab7c28..739063f4b3d114fc8b100e17d868110c505eb177 100644 (file)
@@ -32,6 +32,9 @@
 
 #include "jacobi3d.decl.h"
 #include "TopoManager.h"
+#ifdef JACOBI_OPENMP
+#include <omp.h>
+#endif
 
 // See README for documentation
 
@@ -179,12 +182,27 @@ class Main : public CBase_Main {
            hops += tmgr.getHopsBetweenRanks(p, jmap[i][j][wrap_z(k-1)]);
          }
       CkPrintf("Total Hops: %d\n", hops);
-
-               startTime = CmiWallTimer();
        
-               //Start the computation
-               array.doStep();
-       }
+#ifdef JACOBI_OPENMP 
+      int numOmpThreads = 
+        CkNumPes() / (num_chare_x * num_chare_y * num_chare_z);
+      if (numOmpThreads <= 1) {
+        numOmpThreads = 1; 
+      }
+      CkPrintf("Computation loop will be parallelized"
+               " with %d OpenMP threads\n", numOmpThreads);
+      CProxy_OmpInitializer ompInit = 
+        CProxy_OmpInitializer::ckNew(numOmpThreads);
+#else    
+      //Start the computation
+      start();
+#endif
+    }
+
+  void start() {
+    startTime = CmiWallTimer();                
+    array.doStep();
+  }
 
     // Each worker reports back to here when it completes an iteration
        void report() {
@@ -429,6 +447,9 @@ class Jacobi: public CBase_Jacobi {
     // If all neighbor values have been received, we update our values and proceed
     void compute_kernel() {
 #pragma unroll    
+#ifdef JACOBI_OPENMP
+  #pragma omp parallel for
+#endif
       for(int i=1; i<blockDimX+1; ++i) {
        for(int j=1; j<blockDimY+1; ++j) {
          for(int k=1; k<blockDimZ+1; ++k) {
@@ -555,4 +576,18 @@ class JacobiMap : public CkArrayMap {
     }
 };
 
+class OmpInitializer : public CBase_OmpInitializer{
+public:
+       OmpInitializer(int numThreads) {
+#ifdef JACOBI_OPENMP
+          if (numThreads < 1) {
+            numThreads = 1; 
+          }
+          omp_set_num_threads(numThreads);
+#endif
+          mainProxy.start();
+       }
+};
+
+
 #include "jacobi3d.def.h"
index 5ee6132196137868a4ad3e6ef5ae6f9d4b204e02..ba971940802b501d8ab4adda2623279ff94b7e6b 100644 (file)
@@ -20,6 +20,7 @@ mainmodule jacobi3d {
 
   mainchare Main {
     entry Main(CkArgMsg *m);
+    entry void start();
     entry void report();
   };
 
@@ -49,4 +50,8 @@ mainmodule jacobi3d {
     entry JacobiMap(int x, int y, int z);
   };
 
+  nodegroup OmpInitializer {
+    entry OmpInitializer(int numThreads); 
+  };
+
 };