merge projections and autoperf to use same PAPI init functions
[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, 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 (PAPI_start(papiEventSet) != PAPI_OK) {
161     CmiAbort("PAPI failed to start designated counters!\n");
162   }
163 #endif
164
165 }
166
167 void TraceAutoPerf::endComputation(void) { 
168 #if CMK_HAS_COUNTER_PAPI
169   // we stop the counters here. A silent failure is alright since we
170   // are already at the end of the program.
171   if (PAPI_stop(papiEventSet, papiValues) != PAPI_OK) {
172     CkPrintf("Warning: PAPI failed to stop correctly!\n");
173   }
174   //else 
175   //{
176   //    char eventName[PAPI_MAX_STR_LEN];
177   //    for (int i=0;i<NUMPAPIEVENTS;i++) {
178   //        PAPI_event_code_to_name(papiEvents[i], eventName);
179   //        CkPrintf(" EVENT  %s   counter   %lld \n", eventName, papiValues[i]);
180   //    }
181   //}
182   // NOTE: We should not do a complete close of PAPI until after the
183   // sts writer is done.
184 #endif
185
186 }
187
188 void TraceAutoPerf::malloc(void *where, int size, void **stack, int stackSize)
189 {
190     double m = (double)CmiMemoryUsage();
191     if(memUsage < m){
192         memUsage = m;
193     }
194 }
195
196 void TraceAutoPerf::free(void *where, int size) { }
197
198 void TraceAutoPerf::traceClose(void)
199 {
200     CkpvAccess(_traces)->endComputation();
201     CkpvAccess(_traces)->removeTrace(this);
202 }
203
204 void TraceAutoPerf::markStep()
205 {
206     double now = TraceTimer();
207     timerPair newpairs;
208     newpairs.beginTimer = lastResetTime;
209     newpairs.endTimer = now; 
210     phasesTimers.push_back(newpairs);
211     phaseEndTime = now;
212     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); )
213
214 }
215
216 void _createTraceautoPerf(char **argv)
217 {
218     CkpvInitialize(TraceAutoPerf*, _trace);
219     CkpvAccess(_trace) = new TraceAutoPerf(argv);
220     CkpvAccess(_traces)->addTrace(CkpvAccess(_trace));
221     //CkPrintf("##### init ####\n");
222 }