merge PAPI and fix the bug to run projections and autoPerf together
[charm.git] / src / ck-tune / trace-perf.C
1
2 CkpvStaticDeclare(TraceAutoPerf*, _trace);
3 //-------- group information ---------------------------
4
5 TraceAutoPerf *localAutoPerfTracingInstance()
6 {
7   return CkpvAccess(_trace);
8 }
9
10 // instrumentation and analysis 
11 TraceAutoPerf::TraceAutoPerf(char **argv) 
12 {
13     DEBUG_PRINT( CkPrintf("trace control point resetting %f\n", TraceTimer()); ) 
14     currentSummary = new perfData();  
15     resetTimings();
16     nesting_level = 0;
17     whenStoppedTracing = 0;
18 #if CMK_HAS_COUNTER_PAPI
19     initPAPI();
20 #endif
21     if (CkpvAccess(traceOnPe) == 0) return;
22 }
23
24 void TraceAutoPerf::resetTimings(){
25     totalIdleTime = 0.0;
26     totalEntryMethodTime = 0.0;
27     totalEntryMethodInvocations = 0;
28     lastBeginIdle = lastBeginExecuteTime = lastResetTime = TraceTimer();
29     totalUntracedTime = 0;
30     maxEntryMethodTime = 0;
31     if(whenStoppedTracing !=0){
32         whenStoppedTracing = TraceTimer();
33     }
34
35     currentSummary->numMsgs = 0;
36     currentSummary->numBytes = 0;
37     currentSummary->commTime = 0;
38     currentSummary->objLoadMax = 0;
39 }
40
41 void TraceAutoPerf::resetAll(){
42     totalIdleTime = 0.0;
43     totalEntryMethodTime = 0.0;
44     memUsage = 0;
45     totalEntryMethodInvocations = 0;
46     lastBeginIdle = lastBeginExecuteTime = lastResetTime = TraceTimer();
47     totalUntracedTime = 0;
48     if(whenStoppedTracing !=0){
49         whenStoppedTracing = TraceTimer();
50     }
51     currentSummary->numMsgs = 0;
52     currentSummary->numBytes = 0;
53     currentSummary->commTime = 0;
54     currentSummary->objLoadMax = 0;
55 #if CMK_HAS_COUNTER_PAPI
56     memcpy(previous_papiValues, CkpvAccess(papiValues), sizeof(LONG_LONG_PAPI)*NUMPAPIEVENTS);
57 #endif
58 }
59
60 void TraceAutoPerf::traceBegin(void){
61     if(whenStoppedTracing != 0)
62         totalUntracedTime += (TraceTimer() - whenStoppedTracing);
63     whenStoppedTracing = 0;
64 }
65
66 void TraceAutoPerf::traceEnd(void){
67   CkAssert(whenStoppedTracing == 0); // can't support nested traceEnds on one processor yet...
68   whenStoppedTracing = TraceTimer();
69 }
70
71 void TraceAutoPerf::userEvent(int eventID) { }
72 void TraceAutoPerf::userBracketEvent(int eventID, double bt, double et) { }
73 void TraceAutoPerf::creation(envelope *, int epIdx, int num) { } 
74 void TraceAutoPerf::creationMulticast(envelope *, int epIdx, int num, int *pelist) { }
75 void TraceAutoPerf::creationDone(int num) { }
76 void TraceAutoPerf::messageRecv(char *env, int pe) { }
77
78 void TraceAutoPerf::beginExecute(CmiObjId *tid)
79 {
80     //nesting_level++;
81     lastBeginExecuteTime = TraceTimer();
82     lastEvent =  BEGIN_PROCESSING;
83     lastbeginMessageSize = -1;
84     DEBUG_PRINT( CkPrintf("begin Executing tid   %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
85 }
86
87 void TraceAutoPerf::beginExecute(envelope *env)
88 {
89     //nesting_level++;
90     //if(nesting_level == 1){
91     lastBeginExecuteTime = TraceTimer();
92     lastEvent =  BEGIN_PROCESSING;
93     lastbeginMessageSize = env->getTotalsize();
94     currentSummary->numMsgs++;
95     currentSummary->numBytes += lastbeginMessageSize;
96     DEBUG_PRINT( CkPrintf("begin Executing env   %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
97 }
98
99 void TraceAutoPerf::beginExecute(envelope *env, int event,int msgType,int ep,int srcPe, int mlen, CmiObjId *idx)
100 {
101     //nesting_level++;
102     //if(nesting_level == 1){
103     lastbeginMessageSize = mlen;
104     currentSummary->numMsgs++;
105     currentSummary->numBytes += lastbeginMessageSize;
106     //`currentSummary->commTime += (env->getRecvTime() - env->getSentTime());
107     lastBeginExecuteTime = TraceTimer();
108     lastEvent =  BEGIN_PROCESSING;
109     DEBUG_PRINT( CkPrintf("begin Executing env  6  %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
110 }
111
112 void TraceAutoPerf::beginExecute(int event,int msgType,int ep,int srcPe, int mlen, CmiObjId *idx)
113 {
114     //nesting_level++;
115     //if(nesting_level == 1){
116     lastbeginMessageSize = mlen;
117     lastBeginExecuteTime = TraceTimer();
118     lastEvent =  BEGIN_PROCESSING;
119     DEBUG_PRINT( CkPrintf("begin Executing 6 no env %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
120 }
121
122 void TraceAutoPerf::endExecute(void)
123 {
124     //MAYBE a bug
125     //nesting_level--;
126     nesting_level = 0;
127     if(nesting_level == 0){
128         double endTime = TraceTimer() ;
129         double executionTime = endTime - lastBeginExecuteTime;
130         lastEvent =  -1;
131         DEBUG_PRINT( CkPrintf("end executing %d, duration %d\n", (int)(1000000*endTime), (int)(executionTime*1000000)); )
132         totalEntryMethodTime += executionTime;
133         totalEntryMethodInvocations ++;
134         if(executionTime > maxEntryMethodTime)
135             maxEntryMethodTime = executionTime;
136         double m = (double)CmiMemoryUsage();
137         if(memUsage < m){
138             memUsage = m;
139         }    
140     }
141 }
142
143 void TraceAutoPerf::beginIdle(double curWallTime) {
144     lastBeginIdle =  curWallTime; 
145     lastEvent =  BEGIN_IDLE;
146     double m = (double)CmiMemoryUsage();
147     if(memUsage < m){
148         memUsage = m;
149     }
150 }
151
152 void TraceAutoPerf::endIdle(double curWallTime) {
153     totalIdleTime += (curWallTime - lastBeginIdle) ;
154     lastEvent =  -1;
155 }
156
157 void TraceAutoPerf::beginComputation(void) {
158 #if CMK_HAS_COUNTER_PAPI
159   // we start the counters here
160   if(CkpvAccess(papiStarted) == 0)
161   {
162       if (PAPI_start(CkpvAccess(papiEventSet)) != PAPI_OK) {
163           CmiAbort("PAPI failed to start designated counters!\n");
164       }
165       CkpvAccess(papiStarted) = 1;
166   }
167 #endif
168
169 }
170
171 void TraceAutoPerf::endComputation(void) { 
172 #if CMK_HAS_COUNTER_PAPI
173   // we stop the counters here. A silent failure is alright since we
174   // are already at the end of the program.
175   if(CkpvAccess(papiStopped) == 0) {
176       if (PAPI_stop(CkpvAccess(papiEventSet), CkpvAccess(papiValues)) != PAPI_OK) {
177           CkPrintf("Warning: PAPI failed to stop correctly!\n");
178       }
179       CkpvAccess(papiStopped) = 1;
180   }
181   //else 
182   //{
183   //    char eventName[PAPI_MAX_STR_LEN];
184   //    for (int i=0;i<NUMPAPIEVENTS;i++) {
185   //        PAPI_event_code_to_name(papiEvents[i], eventName);
186   //        CkPrintf(" EVENT  %s   counter   %lld \n", eventName, papiValues[i]);
187   //    }
188   //}
189   // NOTE: We should not do a complete close of PAPI until after the
190   // sts writer is done.
191 #endif
192
193 }
194
195 void TraceAutoPerf::malloc(void *where, int size, void **stack, int stackSize)
196 {
197     double m = (double)CmiMemoryUsage();
198     if(memUsage < m){
199         memUsage = m;
200     }
201 }
202
203 void TraceAutoPerf::free(void *where, int size) { }
204
205 void TraceAutoPerf::traceClose(void)
206 {
207     CkpvAccess(_traces)->endComputation();
208     CkpvAccess(_traces)->removeTrace(this);
209 }
210
211 void TraceAutoPerf::markStep()
212 {
213     double now = TraceTimer();
214     timerPair newpairs;
215     newpairs.beginTimer = lastResetTime;
216     newpairs.endTimer = now; 
217     phasesTimers.push_back(newpairs);
218     phaseEndTime = now;
219     DEBUG_PRINT ( CkPrintf(" PE %d marking phase  %d at timer:%f traceTimer:%f (%f:%f) \n", CmiMyPe(), phasesTimers.size(), now, TraceTimer(), newpairs.beginTimer,  newpairs.endTimer); )
220
221 }
222
223 void _createTraceautoPerf(char **argv)
224 {
225     CkpvInitialize(TraceAutoPerf*, _trace);
226     CkpvAccess(_trace) = new TraceAutoPerf(argv);
227     CkpvAccess(_traces)->addTrace(CkpvAccess(_trace));
228     //CkPrintf("##### init ####\n");
229 }