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