enable the tracing of nested begin/end of entry methods.
authorFilippo Gioachin <gioachin@illinois.edu>
Thu, 20 Aug 2009 01:09:41 +0000 (01:09 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Thu, 20 Aug 2009 01:09:41 +0000 (01:09 +0000)
This solution does not take care of message dependencies: if B is executed inside A, it records
begA, endA, begB, endB, begA, endA
(the second and fifth log entries are the addition)

src/ck-perf/trace-projections.C
src/ck-perf/trace-projections.h

index 4da120b08baf66d3a82cf378a8eda46385829ab3..4ab10b269ad2ce67009657ad8b7401ed0318d286 100644 (file)
@@ -866,7 +866,7 @@ void LogEntry::pup(PUP::er &p)
 
 TraceProjections::TraceProjections(char **argv): 
   curevent(0), inEntry(0), computationStarted(0), 
-  converseExit(0), endTime(0.0)
+  converseExit(0), endTime(0.0), traceNestedEvents(0)
 {
   //  CkPrintf("Trace projections dummy constructor called on %d\n",CkMyPe());
 
@@ -888,6 +888,9 @@ TraceProjections::TraceProjections(char **argv):
   checknested = 
     CmiGetArgFlagDesc(argv,"+checknested",
                      "check projections nest begin end execute events");
+  traceNestedEvents = 
+    CmiGetArgFlagDesc(argv,"+tracenested",
+              "trace projections nest begin/end execute events");
   int binary = 
     CmiGetArgFlagDesc(argv,"+binary-trace",
                      "Write log files in binary format");
@@ -1190,6 +1193,18 @@ void TraceProjections::beginExecute(envelope *e)
 
 void TraceProjections::beginExecute(int event, int msgType, int ep, int srcPe,
                                    int mlen, CmiObjId *idx)
+{
+  if (traceNestedEvents) {
+    if (! nestedEvents.isEmpty()) {
+      endExecuteLocal();
+    }
+    nestedEvents.enq(NestedEvent(event, msgType, ep, srcPe, mlen, idx));
+  }
+  beginExecuteLocal(event, msgType, ep, srcPe, mlen, idx);
+}
+
+void TraceProjections::beginExecuteLocal(int event, int msgType, int ep, int srcPe,
+                                   int mlen, CmiObjId *idx)
 {
 #if CMK_HAS_COUNTER_PAPI
   if (PAPI_read(papiEventSet, papiValues) != PAPI_OK) {
@@ -1209,6 +1224,18 @@ void TraceProjections::beginExecute(int event, int msgType, int ep, int srcPe,
 }
 
 void TraceProjections::endExecute(void)
+{
+  if (traceNestedEvents) nestedEvents.deq();
+  endExecuteLocal();
+  if (traceNestedEvents) {
+    if (! nestedEvents.isEmpty()) {
+      NestedEvent &ne = nestedEvents.peek();
+      beginExecuteLocal(ne.event, ne.msgType, ne.ep, ne.srcPe, ne.ml, ne.idx);
+    }
+  }
+}
+
+void TraceProjections::endExecuteLocal(void)
 {
 #if CMK_HAS_COUNTER_PAPI
   if (PAPI_read(papiEventSet, papiValues) != PAPI_OK) {
index 9f71e1dd65e2486bd50df0a936da1052f3a32311..46712fe93920f422247a28f670e49911a06ac9c8 100644 (file)
@@ -377,6 +377,15 @@ class StrKey {
        }
 };
 
+class NestedEvent {
+ public:
+  int event, msgType, ep, srcPe, ml;
+  CmiObjId *idx;
+  NestedEvent() {}
+  NestedEvent(int _event, int _msgType, int _ep, int _srcPe, int _ml, CmiObjId *_idx) :
+    event(_event), msgType(_msgType), ep(_ep), srcPe(_srcPe), ml(_ml), idx(_idx) { }
+};
+
 /// class for recording trace projections events 
 /**
   TraceProjections will log Converse/Charm++ events and write into .log files;
@@ -395,6 +404,9 @@ class TraceProjections : public Trace {
 
     int funcCount;
     CkHashtableT<StrKey,int> funcHashtable;
+
+       int traceNestedEvents;
+    CkQ<NestedEvent> nestedEvents;
     
     //as user now can specify the idx, it's possible that user may specify an existing idx
     //so that we need a data structure to track idx. --added by Chao Mei
@@ -423,7 +435,9 @@ class TraceProjections : public Trace {
     void beginExecute(envelope *e);
     void beginExecute(CmiObjId  *tid);
     void beginExecute(int event,int msgType,int ep,int srcPe,int ml,CmiObjId *idx=NULL);
+    void beginExecuteLocal(int event,int msgType,int ep,int srcPe,int ml,CmiObjId *idx=NULL);
     void endExecute(void);
+    void endExecuteLocal(void);
     void messageRecv(char *env, int pe);
     void beginIdle(double curWallTime);
     void endIdle(double curWallTime);