Merge branch 'charm' of charmgit:charm into charm
[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 (CkpvAccess(traceOnPe) == 0) return;
18 }
19
20 void TraceAutoPerf::resetTimings(){
21     totalIdleTime = 0.0;
22     totalEntryMethodTime = 0.0;
23     totalEntryMethodInvocations = 0;
24     lastBeginIdle = lastBeginExecuteTime = lastResetTime = TraceTimer();
25     totalUntracedTime = 0;
26     maxEntryMethodTime = 0;
27     if(whenStoppedTracing !=0){
28         whenStoppedTracing = TraceTimer();
29     }
30
31     currentSummary->numMsgs = 0;
32     currentSummary->numBytes = 0;
33     currentSummary->commTime = 0;
34     currentSummary->objLoadMax = 0;
35 }
36
37 void TraceAutoPerf::resetAll(){
38     totalIdleTime = 0.0;
39     totalEntryMethodTime = 0.0;
40     memUsage = 0;
41     totalEntryMethodInvocations = 0;
42     lastBeginIdle = lastBeginExecuteTime = lastResetTime = TraceTimer();
43     totalUntracedTime = 0;
44     if(whenStoppedTracing !=0){
45         whenStoppedTracing = TraceTimer();
46     }
47     currentSummary->numMsgs = 0;
48     currentSummary->numBytes = 0;
49     currentSummary->commTime = 0;
50     currentSummary->objLoadMax = 0;
51 }
52
53 void TraceAutoPerf::traceBegin(void){
54     if(whenStoppedTracing != 0)
55         totalUntracedTime += (TraceTimer() - whenStoppedTracing);
56     whenStoppedTracing = 0;
57 }
58
59 void TraceAutoPerf::traceEnd(void){
60   CkAssert(whenStoppedTracing == 0); // can't support nested traceEnds on one processor yet...
61   whenStoppedTracing = TraceTimer();
62 }
63
64 void TraceAutoPerf::userEvent(int eventID) { }
65 void TraceAutoPerf::userBracketEvent(int eventID, double bt, double et) { }
66 void TraceAutoPerf::creation(envelope *, int epIdx, int num) { } 
67 void TraceAutoPerf::creationMulticast(envelope *, int epIdx, int num, int *pelist) { }
68 void TraceAutoPerf::creationDone(int num) { }
69 void TraceAutoPerf::messageRecv(char *env, int pe) { }
70
71 void TraceAutoPerf::beginExecute(CmiObjId *tid)
72 {
73     //nesting_level++;
74     lastBeginExecuteTime = TraceTimer();
75     lastEvent =  BEGIN_PROCESSING;
76     lastbeginMessageSize = -1;
77     DEBUG_PRINT( CkPrintf("begin Executing tid   %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
78 }
79
80 void TraceAutoPerf::beginExecute(envelope *env)
81 {
82     //nesting_level++;
83     //if(nesting_level == 1){
84     lastBeginExecuteTime = TraceTimer();
85     lastEvent =  BEGIN_PROCESSING;
86     lastbeginMessageSize = env->getTotalsize();
87     currentSummary->numMsgs++;
88     currentSummary->numBytes += lastbeginMessageSize;
89     DEBUG_PRINT( CkPrintf("begin Executing env   %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
90 }
91
92 void TraceAutoPerf::beginExecute(envelope *env, int event,int msgType,int ep,int srcPe, int mlen, CmiObjId *idx)
93 {
94     //nesting_level++;
95     //if(nesting_level == 1){
96     lastbeginMessageSize = mlen;
97     currentSummary->numMsgs++;
98     currentSummary->numBytes += lastbeginMessageSize;
99     //`currentSummary->commTime += (env->getRecvTime() - env->getSentTime());
100     lastBeginExecuteTime = TraceTimer();
101     lastEvent =  BEGIN_PROCESSING;
102     DEBUG_PRINT( CkPrintf("begin Executing env  6  %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
103 }
104
105 void TraceAutoPerf::beginExecute(int event,int msgType,int ep,int srcPe, int mlen, CmiObjId *idx)
106 {
107     //nesting_level++;
108     //if(nesting_level == 1){
109     lastbeginMessageSize = mlen;
110     lastBeginExecuteTime = TraceTimer();
111     lastEvent =  BEGIN_PROCESSING;
112     DEBUG_PRINT( CkPrintf("begin Executing 6 no env %d  msg(%d:%d) time:%d\n", nesting_level, currentSummary->numMsgs, currentSummary->numBytes, (int)(lastBeginExecuteTime*1000000)); )
113 }
114
115 void TraceAutoPerf::endExecute(void)
116 {
117     //MAYBE a bug
118     //nesting_level--;
119     nesting_level = 0;
120     if(nesting_level == 0){
121         double endTime = TraceTimer() ;
122         double executionTime = endTime - lastBeginExecuteTime;
123         lastEvent =  -1;
124         DEBUG_PRINT( CkPrintf("end executing %d, duration %d\n", (int)(1000000*endTime), (int)(executionTime*1000000)); )
125         totalEntryMethodTime += executionTime;
126         totalEntryMethodInvocations ++;
127         if(executionTime > maxEntryMethodTime)
128             maxEntryMethodTime = executionTime;
129         double m = (double)CmiMemoryUsage();
130         if(memUsage < m){
131             memUsage = m;
132         }    
133     }
134 }
135
136 void TraceAutoPerf::beginIdle(double curWallTime) {
137     lastBeginIdle =  curWallTime; 
138     lastEvent =  BEGIN_IDLE;
139     double m = (double)CmiMemoryUsage();
140     if(memUsage < m){
141         memUsage = m;
142     }
143 }
144
145 void TraceAutoPerf::endIdle(double curWallTime) {
146     totalIdleTime += (curWallTime - lastBeginIdle) ;
147     lastEvent =  -1;
148 }
149
150 void TraceAutoPerf::beginComputation(void) { }
151 void TraceAutoPerf::endComputation(void) { }
152
153 void TraceAutoPerf::malloc(void *where, int size, void **stack, int stackSize)
154 {
155     double m = (double)CmiMemoryUsage();
156     if(memUsage < m){
157         memUsage = m;
158     }
159 }
160
161 void TraceAutoPerf::free(void *where, int size) { }
162
163 void TraceAutoPerf::traceClose(void)
164 {
165     CkpvAccess(_traces)->endComputation();
166     CkpvAccess(_traces)->removeTrace(this);
167 }
168
169 void TraceAutoPerf::markStep()
170 {
171     double now = TraceTimer();
172     timerPair newpairs;
173     newpairs.beginTimer = lastResetTime;
174     newpairs.endTimer = now; 
175     phasesTimers.push_back(newpairs);
176     phaseEndTime = now;
177     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); )
178
179 }
180
181 void _createTraceautoPerf(char **argv)
182 {
183     CkpvInitialize(TraceAutoPerf*, _trace);
184     CkpvAccess(_trace) = new TraceAutoPerf(argv);
185     CkpvAccess(_traces)->addTrace(CkpvAccess(_trace));
186     //CkPrintf("##### init ####\n");
187 }