merge PAPI and fix the bug to run projections and autoPerf together
[charm.git] / src / ck-tune / trace-perf.C
index 8bbe06ef0a334571e7f5d1e96c705a856b4683d0..38ce07bd878553317a9a761d904dd17884280036 100644 (file)
@@ -1,3 +1,4 @@
+
 CkpvStaticDeclare(TraceAutoPerf*, _trace);
 //-------- group information ---------------------------
 
@@ -13,7 +14,10 @@ TraceAutoPerf::TraceAutoPerf(char **argv)
     currentSummary = new perfData();  
     resetTimings();
     nesting_level = 0;
-    whenStoppedTracing = 0; 
+    whenStoppedTracing = 0;
+#if CMK_HAS_COUNTER_PAPI
+    initPAPI();
+#endif
     if (CkpvAccess(traceOnPe) == 0) return;
 }
 
@@ -48,6 +52,9 @@ void TraceAutoPerf::resetAll(){
     currentSummary->numBytes = 0;
     currentSummary->commTime = 0;
     currentSummary->objLoadMax = 0;
+#if CMK_HAS_COUNTER_PAPI
+    memcpy(previous_papiValues, CkpvAccess(papiValues), sizeof(LONG_LONG_PAPI)*NUMPAPIEVENTS);
+#endif
 }
 
 void TraceAutoPerf::traceBegin(void){
@@ -147,8 +154,43 @@ void TraceAutoPerf::endIdle(double curWallTime) {
     lastEvent =  -1;
 }
 
-void TraceAutoPerf::beginComputation(void) { }
-void TraceAutoPerf::endComputation(void) { }
+void TraceAutoPerf::beginComputation(void) {
+#if CMK_HAS_COUNTER_PAPI
+  // we start the counters here
+  if(CkpvAccess(papiStarted) == 0)
+  {
+      if (PAPI_start(CkpvAccess(papiEventSet)) != PAPI_OK) {
+          CmiAbort("PAPI failed to start designated counters!\n");
+      }
+      CkpvAccess(papiStarted) = 1;
+  }
+#endif
+
+}
+
+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(CkpvAccess(papiStopped) == 0) {
+      if (PAPI_stop(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
+          CkPrintf("Warning: PAPI failed to stop correctly!\n");
+      }
+      CkpvAccess(papiStopped) = 1;
+  }
+  //else 
+  //{
+  //    char eventName[PAPI_MAX_STR_LEN];
+  //    for (int i=0;i<NUMPAPIEVENTS;i++) {
+  //        PAPI_event_code_to_name(papiEvents[i], eventName);
+  //        CkPrintf(" EVENT  %s   counter   %lld \n", eventName, papiValues[i]);
+  //    }
+  //}
+  // NOTE: We should not do a complete close of PAPI until after the
+  // sts writer is done.
+#endif
+
+}
 
 void TraceAutoPerf::malloc(void *where, int size, void **stack, int stackSize)
 {