remove an NULL exit function.
[charm.git] / src / ck-perf / trace-controlPoints.C
1 #include "charm++.h"
2 #include "trace-controlPoints.h"
3 #include "trace-controlPointsBOC.h"
4
5
6 /**
7  *   \addtogroup ControlPointFramework
8  *   @{
9  */
10
11
12 // Charm++ "processor"(user thread)-private global variable
13 CkpvStaticDeclare(TraceControlPoints*, _trace);
14
15 // This global variable is required for any post-execution 
16 // parallel analysis or parallel activities the trace module 
17 // might wish to perform.
18 CkGroupID traceControlPointsGID;
19
20 /**
21   For each TraceFoo module, _createTraceFoo() must be defined.
22   This function is called in _createTraces() generated in moduleInit.C
23
24   This module is special in that it is always included in charm, but sometimes it does nothing.
25   This is called on all processors in SMP version.
26 */
27 void _createTracecontrolPoints(char **argv)
28 {
29   CkpvInitialize(TraceControlPoints*, _trace);
30   CkpvAccess(_trace) = new TraceControlPoints(argv);
31   CkpvAccess(_traces)->addTrace(CkpvAccess(_trace));
32 }
33
34 TraceControlPoints::TraceControlPoints(char **argv)
35 {
36   resetTimings();
37
38   nesting_level = 0;
39
40   b1=0;
41   b2=0;
42   b3=0;
43
44   if (CkpvAccess(traceOnPe) == 0) return;
45
46   // Process runtime arguments intended for the module
47   // CmiGetArgIntDesc(argv,"+ControlPointsPar0", &par0, "Fake integer parameter 0");
48 }
49
50 void TraceControlPoints::userEvent(int eventID) 
51 {
52   //  CkPrintf("[%d] User Point Event id %d encountered\n", CkMyPe(), eventID);
53 }
54
55 void TraceControlPoints::userBracketEvent(int eventID, double bt, double et) {
56   //  CkPrintf("[%d] User Bracket Event id %d encountered\n", CkMyPe(), eventID);
57 }
58
59 void TraceControlPoints::creation(envelope *, int epIdx, int num) {
60   //  CkPrintf("[%d] Point-to-Point Message for Entry Method id %d sent\n",  CkMyPe(), epIdx);
61 }
62
63 void TraceControlPoints::creationMulticast(envelope *, int epIdx, int num, 
64                                     int *pelist) {
65   //  CkPrintf("[%d] Multicast Message for Entry Method id %d sent to %d pes\n", CkMyPe(), epIdx, num);
66 }
67
68 void TraceControlPoints::creationDone(int num) {
69   //  CkPrintf("[%d] Last initiated send completes\n", CkMyPe());
70 }
71   
72 void TraceControlPoints::messageRecv(char *env, int pe) {
73   // CkPrintf("[%d] Message from pe %d received by scheduler\n", CkMyPe(), pe);
74 }
75   
76 void TraceControlPoints::beginExecute(CmiObjId *tid)
77 {
78   nesting_level++;
79   if(nesting_level == 1){
80     // CmiObjId is a 4-integer tuple uniquely identifying a migratable
81     //   Charm++ object. Note that there are other non-migratable Charm++
82     //   objects that CmiObjId will not identify.
83     b1++;
84     lastBeginExecuteTime = CmiWallTimer();
85     lastbeginMessageSize = -1;
86   }
87 }
88
89
90
91 void TraceControlPoints::beginExecute(envelope *e)
92 {
93   nesting_level++;
94   if(nesting_level == 1){
95     lastBeginExecuteTime = CmiWallTimer();
96     lastbeginMessageSize = e->getTotalsize();
97     b2++;
98     b2mlen += lastbeginMessageSize;
99   }
100 }
101  
102 void TraceControlPoints::beginExecute(int event,int msgType,int ep,int srcPe, 
103                                int mlen, CmiObjId *idx)
104 {
105   nesting_level++;
106   if(nesting_level == 1){
107     b3++;
108     b3mlen += mlen;
109     lastBeginExecuteTime = CmiWallTimer();
110     lastbeginMessageSize = mlen;
111   }
112 }
113
114 void TraceControlPoints::endExecute(void)
115 {
116   //  CkPrintf("TraceControlPoints::endExecute\n");
117   nesting_level--;
118   if(nesting_level == 0){
119     
120     double executionTime = CmiWallTimer() - lastBeginExecuteTime;
121     totalEntryMethodTime += executionTime;
122     totalEntryMethodInvocations ++;
123     
124     double m = (double)CmiMemoryUsage();
125     if(memUsage < m){
126       memUsage = m;
127     }    
128   }
129 }
130
131 void TraceControlPoints::beginIdle(double curWallTime) {
132   lastBeginIdle = CmiWallTimer();
133   // CkPrintf("[%d] Scheduler has no useful user-work\n", CkMyPe());
134
135   double m = (double)CmiMemoryUsage();
136   if(memUsage < m){
137     memUsage = m;
138   }
139 }
140
141 void TraceControlPoints::endIdle(double curWallTime) {
142   totalIdleTime += CmiWallTimer() - lastBeginIdle;
143   //  CkPrintf("[%d] Scheduler now has useful user-work\n", CkMyPe());
144 }
145
146 void TraceControlPoints::beginComputation(void)
147 {
148   //  CkPrintf("[%d] Computation Begins\n", CkMyPe());
149   // Code Below shows what trace-summary would do.
150   // initialze arrays because now the number of entries is known.
151   // _logPool->initMem();
152 }
153
154 void TraceControlPoints::endComputation(void)
155 {
156   //  CkPrintf("[%d] Computation Ends\n", CkMyPe());
157 }
158
159 void TraceControlPoints::malloc(void *where, int size, void **stack, int stackSize)
160 {
161   // CkPrintf("[%d] Memory allocation of size %d occurred\n", CkMyPe(), size);
162   double m = (double)CmiMemoryUsage();
163   if(memUsage < m){
164     memUsage = m;
165   }
166 }
167
168 void TraceControlPoints::free(void *where, int size) {
169   //  CkPrintf("[%d] %d-byte Memory block freed\n", CkMyPe(), size);
170 }
171
172 void TraceControlPoints::traceClose(void)
173 {
174   // Print out some performance counters on BG/P
175   CProxy_TraceControlPointsBOC myProxy(traceControlPointsGID);
176   myProxy.ckLocalBranch()->printBGP_UPC_CountersBOC();
177
178     
179   CkpvAccess(_trace)->endComputation();
180   // remove myself from traceArray so that no tracing will be called.
181   CkpvAccess(_traces)->removeTrace(this);
182 }
183
184 void printBGP_UPC_Counters(void);
185
186 void TraceControlPointsBOC::printBGP_UPC_CountersBOC(void) {
187 #ifdef CMK_BLUEGENEP
188         printBGP_UPC_Counters();
189 #endif
190 }
191
192
193
194 void TraceControlPoints::resetTimings(){
195   totalIdleTime = 0.0;
196   totalEntryMethodTime = 0.0;
197   totalEntryMethodInvocations = 0;
198   lastResetTime = CmiWallTimer();
199 }
200
201 void TraceControlPoints::resetAll(){
202   totalIdleTime = 0.0;
203   totalEntryMethodTime = 0.0;
204   memUsage = 0;
205   totalEntryMethodInvocations = 0;
206   b2mlen=0;
207   b3mlen=0;
208   b2=0;
209   b3=0;
210   lastResetTime = CmiWallTimer();
211 }
212
213
214
215 TraceControlPoints *localControlPointTracingInstance(){
216   return CkpvAccess(_trace);
217 }
218
219
220
221 extern "C" void traceControlPointsExitFunction() {
222   // The exit function of any Charm++ module must call CkExit() or
223   // the entire exit process will hang if multiple modules are linked.
224   // FIXME: This is NOT a feature. Something needs to be done about this.
225   CkExit();
226 }
227
228 // Initialization of the parallel trace module.
229 void initTraceControlPointsBOC() {
230 /*
231 #ifdef __BLUEGENE__
232   if (BgNodeRank()==0) {
233 #else
234     if (CkMyRank() == 0) {
235 #endif
236       registerExitFn(traceControlPointsExitFunction);
237     }
238 */
239 }
240
241 #include "TraceControlPoints.def.h"
242
243
244 /*@}*/