Added the openmp test for performance comparison of the simple loop benchmark.
authorChao Mei <chaomei2@illinois.edu>
Mon, 23 Jan 2012 19:36:18 +0000 (13:36 -0600)
committerChao Mei <chaomei2@illinois.edu>
Mon, 23 Jan 2012 19:36:18 +0000 (13:36 -0600)
example/simpleLoopBench/Makefile
example/simpleLoopBench/hello.C
example/simpleLoopBench/hello.ci
example/simpleLoopBench/hello.h

index 1b6df99fc8fb5e46af8303735d02826d871d8b3b..39087d46bf9e6eb501f699a28175f9294260dd37 100644 (file)
@@ -1,5 +1,5 @@
 #NOTE: to compile the example, the NodeHelper.decl/def.h should exist
-USEROPTS=-O3 -g -lpthread
+USEROPTS=-O3 -g -lpthread -fopenmp
 CHARMDIR=$(HOME)/curcvs/charm/net-linux-x86_64-smp-opt/
 CHARMINC=$(CHARMDIR)/include
 OPTS=-I$(CHARMINC) $(USEROPTS)
index 93122483afa78a05983d11b73e2d954ceb84f93c..55b8a382ff2539bdb072a56ab54a29cd886d0390 100644 (file)
@@ -5,6 +5,8 @@
 
 #include "hello.decl.h"
 
+#include <omp.h>
+
 #define TEST_REPEAT_TIMES 10
 
 CProxy_Main mainProxy;
@@ -32,6 +34,18 @@ void work(int start, int end, void *result) {
     }
     *(int *)result = tmp;
 }
+
+int openMPWork(int start, int end) {
+    int result = 0;
+    
+    #pragma omp parallel for reduction (+:result)
+    for(int i=start; i<=end; i++) {
+        result += (int)(sqrt(1+cos(i*1.57)));
+    }
+    
+    return result;
+}
+
 extern "C" void doCalc(int first, int last, void *result, int paramNum, void * param) {    
     //double tstart = CmiWallTimer();
     
@@ -53,6 +67,8 @@ Main::Main(CkArgMsg* m) {
     mainStep = 0;
        numElemFinished = 0;
        
+    curTestMode = 0;
+    
     //process command line
     if (m->argc >1 ){
         processCommandLine(m->argc,m->argv);
@@ -62,6 +78,8 @@ Main::Main(CkArgMsg* m) {
        }
     delete m;
        
+    omp_set_num_threads(numChunks);    
+    
        mainTimes = new double[loopTimes];
        memset(mainTimes, 0, sizeof(double)*loopTimes);
        
@@ -110,6 +128,7 @@ void Main::done(void) {
             return;
         }
     }  
+    
        //do some final output
        allTestsProxy[0].reportSts();
 };
@@ -122,17 +141,40 @@ void Main::exitTest(){
        int maxi = TEST_REPEAT_TIMES;
        CkPrintf("Global timestep info: avg time: %.3f [%.3f, %.3f, %.3f] (us)\n", sum/(maxi-3), mainTimes[0], mainTimes[maxi/2], mainTimes[maxi-1]);
        
-       CkPrintf("All done\n");
-       CkExit();
+    if(curTestMode == 0){
+           CkPrintf("Charm++ NodeHelper Test done\n\n");
+        curTestMode++;
+        mainStep = 0;
+        numElemFinished = 0;
+        doTests(NULL);
+    }else if(curTestMode == 1){        
+        CkPrintf("OpenMP Test done\n");
+        CkExit();
+    }
 }
 
 void Main::doTests(CkQdMsg *msg) {
     delete msg;
     
+    if(mainStep == 0){
+        if(curTestMode == 0){
+            CkPrintf("===Start NodeHelper Test===\n");
+        }else if(curTestMode == 1){
+            int numthds = 0;
+            int openmpid;
+            #pragma omp parallel private(openmpid)
+            {
+                openmpid = omp_get_thread_num();
+                if(openmpid == 0) numthds = omp_get_num_threads();
+            }
+            CkPrintf("===Start OpenMP Test with %d threads===\n", numthds);
+        }
+    }
+    
        timestamp = CmiWallTimer(); //record the start time of the whole test
     for (int i=0; i<totalElems; i++) {
-        allTestsProxy[i].doTest(mainStep);
-        //allTestsProxy[8].doTest(mainStep);
+        allTestsProxy[i].doTest(mainStep, curTestMode);
+        //allTestsProxy[8].doTest(mainStep, curTestMode);
     }
 };
 
@@ -171,13 +213,19 @@ TestInstance::TestInstance() {
        memset(allResults, 0, sizeof(int)*loopTimes);
 }
 
-void TestInstance::doTest(int curstep) {
+void TestInstance::doTest(int curstep, int curTestMode) {
     //printf("On proc %d node %d, begin parallel execution for test case %d %dth iteration\n", CkMyPe(), CkMyNode(), thisIndex,flag);
        hasTest = 1;
-    double timerec = CmiWallTimer();
        int result;
        
-       NodeHelper_Parallelize(nodeHelperProxy, doCalc, 0, NULL, 0, numChunks, 0, loopTimes-1, &result, NODEHELPER_INT_SUM);
+    double timerec = CmiWallTimer();
+    
+    if(curTestMode == 0){
+           NodeHelper_Parallelize(nodeHelperProxy, doCalc, 0, NULL, 0, numChunks, 0, loopTimes-1, &result, NODEHELPER_INT_SUM);
+    }else if(curTestMode == 1){
+        result = openMPWork(0, loopTimes-1);
+    }
+    
     allTimes[curstep]=(CmiWallTimer()-timerec)*1e6;
        allResults[curstep] = result;
        
@@ -196,8 +244,8 @@ void TestInstance::reportSts(){
                avgResult /= TEST_REPEAT_TIMES;
                
                int maxi = TEST_REPEAT_TIMES;
-               CkPrintf("Test instance[%d]: result:%.3f, avg time: %.3f [%.3f, %.3f, %.3f] (us)\n",thisIndex, avgResult, sum/(maxi-3), allTimes[0], allTimes[maxi/2], allTimes[maxi-1]);
-       }
+               CkPrintf("Test instance[%d]: result:%.3f, avg time: %.3f [%.3f, %.3f, %.3f] (us)\n",thisIndex, avgResult, sum/(maxi-3), allTimes[0], allTimes[maxi/2], allTimes[maxi-1]);           
+    }
        
        if(thisIndex == totalElems-1) mainProxy.exitTest();
        else thisProxy[thisIndex+1].reportSts();
index e69799c2772c6b704fed17ea0d624c0ca2f79e60..4271ef4806729df7ae98f198bb76f1bf74ddf75f 100644 (file)
@@ -16,7 +16,7 @@ mainmodule hello {
 
   array [1D] TestInstance{
     entry TestInstance();
-    entry void doTest(int curstep);
+    entry void doTest(int curstep, int curTestMode);
        entry void reportSts();
    };
 
index 661d477bb1671ea4b4fd48a22674fbe1c6bece5c..fe625f583ec1f396e41723db5fe8b1b8d492bcd1 100644 (file)
@@ -12,6 +12,8 @@ private:
        double timestamp;
        int mainStep; //the global counter of timesteps
        double *mainTimes; //record each timestep from test initiation to test finish (i.e. from the point of main)
+    
+    int curTestMode; //0: nodeHelper; 1: OpenMP
 
 public:
     Main(CkArgMsg* m) ;
@@ -19,7 +21,6 @@ public:
        void exitTest();
     void doTests(CkQdMsg *msg);
     void processCommandLine(int argc,char ** argv);
-
 };
 
 class TestInstance : public CBase_TestInstance {
@@ -35,7 +36,7 @@ public:
                delete [] allResults;
        }
     TestInstance(CkMigrateMessage *m) {}
-    void doTest(int curstep);
+    void doTest(int curstep, int curTestMode);
        void reportSts();
 };