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