merge PAPI and fix the bug to run projections and autoPerf together
authorYanhua Sun <sun51@illinois.edu>
Fri, 20 Sep 2013 03:19:52 +0000 (22:19 -0500)
committerYanhua Sun <sun51@illinois.edu>
Fri, 20 Sep 2013 03:19:52 +0000 (22:19 -0500)
src/ck-perf/trace-common.C
src/ck-perf/trace-common.h
src/ck-perf/trace-projections.C
src/ck-perf/trace-projections.h
src/ck-tune/trace-autoPerf.h
src/ck-tune/trace-perf.C

index 752ff19f83554009a2e16dccc45d5e8f3202ea6b..aef97798a548b8e396bbb62df6bdf7580e920ec1 100644 (file)
@@ -770,6 +770,10 @@ void traceChangeLastTimestamp(double ts){
 }
 
 #if CMK_HAS_COUNTER_PAPI
+CkpvDeclare(int, papiEventSet);
+CkpvDeclare(LONG_LONG_PAPI*, papiValues);
+CkpvDeclare(int, papiStarted);
+CkpvDeclare(int, papiStopped);
 #ifdef USE_SPP_PAPI
 int papiEvents[NUMPAPIEVENTS];
 #else
@@ -778,16 +782,18 @@ int papiEvents[NUMPAPIEVENTS] = { PAPI_L2_DCM, PAPI_FP_OPS };
 #endif // CMK_HAS_COUNTER_PAPI
 
 #if CMK_HAS_COUNTER_PAPI
-extern "C"
 void initPAPI() {
 #if CMK_HAS_COUNTER_PAPI
   // We initialize and create the event sets for use with PAPI here.
-  static int called = 0;
-  if(called == 1)
-      return;
-  called = 1;
   int papiRetValue;
   if(CkMyRank()==0){
+      papiRetValue = PAPI_is_initialized();
+      if(papiRetValue != PAPI_NOT_INITED)
+          return;
+      CkpvInitialize(int, papiStarted);
+      CkpvAccess(papiStarted) = 0;
+      CkpvInitialize(int, papiStopped);
+      CkpvAccess(papiStopped) = 0;
     papiRetValue = PAPI_library_init(PAPI_VER_CURRENT);
     if (papiRetValue != PAPI_VER_CURRENT) {
       CmiAbort("PAPI Library initialization failure!\n");
@@ -808,8 +814,9 @@ void initPAPI() {
   #endif
 #endif
   // PAPI 3 mandates the initialization of the set to PAPI_NULL
-  papiEventSet = PAPI_NULL; 
-  if (PAPI_create_eventset(&papiEventSet) != PAPI_OK) {
+  CkpvInitialize(int, papiEventSet); 
+  CkpvAccess(papiEventSet) = PAPI_NULL; 
+  if (PAPI_create_eventset(&CkpvAccess(papiEventSet)) != PAPI_OK) {
     CmiAbort("PAPI failed to create event set!\n");
   }
 #ifdef USE_SPP_PAPI
@@ -853,7 +860,7 @@ void initPAPI() {
 #else
   // just uses { PAPI_L2_DCM, PAPI_FP_OPS } the 2 initialized PAPI_EVENTS
 #endif
-  papiRetValue = PAPI_add_events(papiEventSet, papiEvents, NUMPAPIEVENTS);
+  papiRetValue = PAPI_add_events(CkpvAccess(papiEventSet), papiEvents, NUMPAPIEVENTS);
   if (papiRetValue < 0) {
     if (papiRetValue == PAPI_ECNFLCT) {
       CmiAbort("PAPI events conflict! Please re-assign event types!\n");
@@ -876,7 +883,9 @@ void initPAPI() {
        }
       CmiPrintf("\n");
     }
-  memset(papiValues, 0, NUMPAPIEVENTS*sizeof(LONG_LONG_PAPI));
+  CkpvInitialize(LONG_LONG_PAPI*, papiValues);
+  CkpvAccess(papiValues) = (LONG_LONG_PAPI*)malloc(NUMPAPIEVENTS*sizeof(LONG_LONG_PAPI));
+  memset(CkpvAccess(papiValues), 0, NUMPAPIEVENTS*sizeof(LONG_LONG_PAPI));
 #endif
 }
 #endif
index 570ba97a41953116948e3aa8dc539ca9933d85a6..4c0dfe0bfd02a4f78ca9712ab2ddd40210916d85 100644 (file)
@@ -110,8 +110,18 @@ extern void traceWriteSTS(FILE *stsfp,int nUserEvents);
 extern "C" void (*registerMachineUserEvents())();
 
 #if CMK_HAS_COUNTER_PAPI
+#include <papi.h>
+#ifdef USE_SPP_PAPI
+#define NUMPAPIEVENTS 6
+#else
+#define NUMPAPIEVENTS 2
+#endif
+CkpvExtern(int, papiEventSet);
+CkpvExtern(LONG_LONG_PAPI*, papiValues);
+CkpvExtern(int, papiStarted);
+CkpvExtern(int, papiStopped);
 extern int papiEvents[NUMPAPIEVENTS];
-extern "C" void initPAPI(); 
+void initPAPI(); 
 #endif
 
 #endif
index a5f3a5f498e11133a3c0944944781035246a92dd..4e13616a7681d0274d57c876af926550bf93ffa7 100644 (file)
@@ -971,7 +971,7 @@ void LogEntry::pup(PUP::er &p)
       for (i=0; i<NUMPAPIEVENTS; i++) {
        // not yet!!!
        //      p|papiIDs[i]; 
-       p|papiValues[i];
+       p|CkpvAccess(papiValues)[i];
        
       }
 #else
@@ -990,7 +990,7 @@ void LogEntry::pup(PUP::er &p)
       for (i=0; i<NUMPAPIEVENTS; i++) {
        // not yet!!!
        //      p|papiIDs[i];
-       p|papiValues[i];
+       p|CkpvAccess(papiValues)[i];
       }
 #else
       //p|numPapiEvents;  // non papi version has value 0
@@ -1476,7 +1476,7 @@ void TraceProjections::creationDone(int num)
 void TraceProjections::beginExecute(CmiObjId *tid)
 {
 #if CMK_HAS_COUNTER_PAPI
-  if (PAPI_read(papiEventSet, papiValues) != PAPI_OK) {
+  if (PAPI_read(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
     CmiAbort("PAPI failed to read at begin execute!\n");
   }
 #endif
@@ -1486,7 +1486,7 @@ void TraceProjections::beginExecute(CmiObjId *tid)
   _logPool->add(BEGIN_PROCESSING,ForChareMsg,_threadEP, TraceTimer(),
                execEvent,CkMyPe(), 0, tid);
 #if CMK_HAS_COUNTER_PAPI
-  _logPool->addPapi(papiValues);
+  _logPool->addPapi(CkpvAccess(papiValues));
 #endif
   inEntry = 1;
 }
@@ -1495,7 +1495,7 @@ void TraceProjections::beginExecute(envelope *e)
 {
   if(e==0) {
 #if CMK_HAS_COUNTER_PAPI
-    if (PAPI_read(papiEventSet, papiValues) != PAPI_OK) {
+    if (PAPI_read(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
       CmiAbort("PAPI failed to read at begin execute!\n");
     }
 #endif
@@ -1505,7 +1505,7 @@ void TraceProjections::beginExecute(envelope *e)
     _logPool->add(BEGIN_PROCESSING,ForChareMsg,_threadEP, TraceTimer(),
                  execEvent,CkMyPe(), 0, NULL, 0.0, TraceCpuTimer());
 #if CMK_HAS_COUNTER_PAPI
-    _logPool->addPapi(papiValues);
+    _logPool->addPapi(CkpvAccess(papiValues));
 #endif
     inEntry = 1;
   } else {
@@ -1545,7 +1545,7 @@ void TraceProjections::beginExecuteLocal(int event, int msgType, int ep, int src
                                    int mlen, CmiObjId *idx)
 {
 #if CMK_HAS_COUNTER_PAPI
-  if (PAPI_read(papiEventSet, papiValues) != PAPI_OK) {
+  if (PAPI_read(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
     CmiAbort("PAPI failed to read at begin execute!\n");
   }
 #endif
@@ -1556,7 +1556,7 @@ void TraceProjections::beginExecuteLocal(int event, int msgType, int ep, int src
   _logPool->add(BEGIN_PROCESSING,msgType,ep, TraceTimer(),event,
                srcPe, mlen, idx, 0.0, TraceCpuTimer());
 #if CMK_HAS_COUNTER_PAPI
-  _logPool->addPapi(papiValues);
+  _logPool->addPapi(CkpvAccess(papiValues));
 #endif
   inEntry = 1;
 }
@@ -1587,7 +1587,7 @@ void TraceProjections::endExecute(char *msg)
 void TraceProjections::endExecuteLocal(void)
 {
 #if CMK_HAS_COUNTER_PAPI
-  if (PAPI_read(papiEventSet, papiValues) != PAPI_OK) {
+  if (PAPI_read(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
     CmiAbort("PAPI failed to read at end execute!\n");
   }
 #endif
@@ -1602,7 +1602,7 @@ void TraceProjections::endExecuteLocal(void)
                  execEvent, execPe, 0, NULL, 0.0, cputime);
   }
 #if CMK_HAS_COUNTER_PAPI
-  _logPool->addPapi(papiValues);
+  _logPool->addPapi(CkpvAccess(papiValues));
 #endif
   inEntry = 0;
 }
@@ -1678,8 +1678,12 @@ void TraceProjections::beginComputation(void)
   _logPool->add(BEGIN_COMPUTATION, 0, 0, TraceTimer(), -1, -1);
 #if CMK_HAS_COUNTER_PAPI
   // we start the counters here
-  if (PAPI_start(papiEventSet) != PAPI_OK) {
-    CmiAbort("PAPI failed to start designated counters!\n");
+  if(CkpvAccess(papiStarted) == 0)
+  {
+      if (PAPI_start(CkpvAccess(papiEventSet)) != PAPI_OK) {
+          CmiAbort("PAPI failed to start designated counters!\n");
+      }
+      CkpvAccess(papiStarted) = 1;
   }
 #endif
 }
@@ -1689,8 +1693,11 @@ void TraceProjections::endComputation(void)
 #if CMK_HAS_COUNTER_PAPI
   // we stop the counters here. A silent failure is alright since we
   // are already at the end of the program.
-  if (PAPI_stop(papiEventSet, papiValues) != PAPI_OK) {
-    CkPrintf("Warning: PAPI failed to stop correctly!\n");
+  if(CkpvAccess(papiStopped) == 0) {
+      if (PAPI_stop(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
+          CkPrintf("Warning: PAPI failed to stop correctly!\n");
+      }
+      CkpvAccess(papiStopped) = 1;
   }
   // NOTE: We should not do a complete close of PAPI until after the
   // sts writer is done.
index ca022e9b9040adbc0513a557e2d0944c47b1d0d0..14359e44b647cd532048d2f809b3f310aad82325 100644 (file)
 #include "trace-common.h"
 #include "ckhashtable.h"
 
-#if CMK_HAS_COUNTER_PAPI
-#include <papi.h>
-#ifdef USE_SPP_PAPI
-#define NUMPAPIEVENTS 6
-#else
-#define NUMPAPIEVENTS 2
-#endif
-#endif
-
 #if CMK_PROJECTIONS_USE_ZLIB
 #include <zlib.h>
 #endif
@@ -485,10 +476,6 @@ class TraceProjections : public Trace {
     //so that we need a data structure to track idx. --added by Chao Mei
     CkVec<int> idxVec;
     int idxRegistered(int idx);    
-#if CMK_HAS_COUNTER_PAPI
-    int papiEventSet;
-    LONG_LONG_PAPI papiValues[NUMPAPIEVENTS];
-#endif
 public:
     int converseExit; // used for exits that bypass CkExit.
     double endTime;
index 1d0f998fc7557838f2959f2f4b8cd8f9cf122d71..44baad14d3c144a6b601dd224077865cbcba4705 100644 (file)
 #include <map>
 #include <list>
 
-
-#if CMK_HAS_COUNTER_PAPI
-#include <papi.h>
-#ifdef USE_SPP_PAPI
-#define NUMPAPIEVENTS 8
-#else
-#define NUMPAPIEVENTS 9
-#endif
-#endif
-
-
-
 using namespace std;
 
 extern CkGroupID traceAutoPerfGID;
@@ -190,7 +178,6 @@ public:
 #if CMK_HAS_COUNTER_PAPI
     LONG_LONG_PAPI papiValues[NUMPAPIEVENTS];
 #endif
-
     // functions
     perfData(){}
 };
@@ -264,8 +251,6 @@ class TraceAutoPerf : public Trace {
 public:
 
 #if CMK_HAS_COUNTER_PAPI
-    int papiEventSet;
-    LONG_LONG_PAPI papiValues[NUMPAPIEVENTS];
     LONG_LONG_PAPI previous_papiValues[NUMPAPIEVENTS];
 #endif
     double  lastBeginExecuteTime;
@@ -461,7 +446,7 @@ public:
 #if CMK_HAS_COUNTER_PAPI
   inline void readPAPI()
   {
-      if (PAPI_read(papiEventSet, papiValues) != PAPI_OK) {
+      if (PAPI_read(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
           CmiAbort("PAPI failed to read at begin execute!\n");
       }
   }
@@ -482,7 +467,7 @@ public:
       readPAPI();
       for(int i=0; i<NUMPAPIEVENTS; i++)
       {
-          currentSummary->papiValues[i] = (papiValues[i] - previous_papiValues[i]);
+          currentSummary->papiValues[i] = (CkpvAccess(papiValues)[i] - previous_papiValues[i]);
       }
 #endif
       return currentSummary;
index a8981145b9a23ae0f704a4b279c08d6b59d596a1..38ce07bd878553317a9a761d904dd17884280036 100644 (file)
@@ -53,7 +53,7 @@ void TraceAutoPerf::resetAll(){
     currentSummary->commTime = 0;
     currentSummary->objLoadMax = 0;
 #if CMK_HAS_COUNTER_PAPI
-    memcpy(previous_papiValues, papiValues, sizeof(LONG_LONG_PAPI)*NUMPAPIEVENTS);
+    memcpy(previous_papiValues, CkpvAccess(papiValues), sizeof(LONG_LONG_PAPI)*NUMPAPIEVENTS);
 #endif
 }
 
@@ -157,8 +157,12 @@ void TraceAutoPerf::endIdle(double curWallTime) {
 void TraceAutoPerf::beginComputation(void) {
 #if CMK_HAS_COUNTER_PAPI
   // we start the counters here
-  if (PAPI_start(papiEventSet) != PAPI_OK) {
-    CmiAbort("PAPI failed to start designated counters!\n");
+  if(CkpvAccess(papiStarted) == 0)
+  {
+      if (PAPI_start(CkpvAccess(papiEventSet)) != PAPI_OK) {
+          CmiAbort("PAPI failed to start designated counters!\n");
+      }
+      CkpvAccess(papiStarted) = 1;
   }
 #endif
 
@@ -168,8 +172,11 @@ void TraceAutoPerf::endComputation(void) {
 #if CMK_HAS_COUNTER_PAPI
   // we stop the counters here. A silent failure is alright since we
   // are already at the end of the program.
-  if (PAPI_stop(papiEventSet, papiValues) != PAPI_OK) {
-    CkPrintf("Warning: PAPI failed to stop correctly!\n");
+  if(CkpvAccess(papiStopped) == 0) {
+      if (PAPI_stop(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
+          CkPrintf("Warning: PAPI failed to stop correctly!\n");
+      }
+      CkpvAccess(papiStopped) = 1;
   }
   //else 
   //{