Adding some BGP UPC preliminary performance counter support for use in
[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   //  CkPrintf("[%d] Previously executing Entry Method completes. lastbeginMessageSize=%d executionTime=%lf\n", CkMyPe(), lastbeginMessageSize, executionTime);
113 }
114
115 void TraceControlPoints::beginIdle(double curWallTime) {
116   lastBeginIdle = CmiWallTimer();
117   // CkPrintf("[%d] Scheduler has no useful user-work\n", CkMyPe());
118 }
119
120 void TraceControlPoints::endIdle(double curWallTime) {
121   totalIdleTime += CmiWallTimer() - lastBeginIdle;
122   //  CkPrintf("[%d] Scheduler now has useful user-work\n", CkMyPe());
123 }
124
125 void TraceControlPoints::beginComputation(void)
126 {
127   //  CkPrintf("[%d] Computation Begins\n", CkMyPe());
128   // Code Below shows what trace-summary would do.
129   // initialze arrays because now the number of entries is known.
130   // _logPool->initMem();
131 }
132
133 void TraceControlPoints::endComputation(void)
134 {
135   //  CkPrintf("[%d] Computation Ends\n", CkMyPe());
136 }
137
138 void TraceControlPoints::malloc(void *where, int size, void **stack, int stackSize)
139 {
140   // CkPrintf("[%d] Memory allocation of size %d occurred\n", CkMyPe(), size);
141 }
142
143 void TraceControlPoints::free(void *where, int size) {
144   //  CkPrintf("[%d] %d-byte Memory block freed\n", CkMyPe(), size);
145 }
146
147 void TraceControlPoints::traceClose(void)
148 {
149   // Print out some performance counters on BG/P
150   CProxy_TraceControlPointsBOC myProxy(traceControlPointsGID);
151   myProxy.ckLocalBranch()->printBGP_UPC_CountersBOC();
152
153     
154   CkpvAccess(_trace)->endComputation();
155   // remove myself from traceArray so that no tracing will be called.
156   CkpvAccess(_traces)->removeTrace(this);
157 }
158
159 void printBGP_UPC_Counters(void);
160
161 void TraceControlPointsBOC::printBGP_UPC_CountersBOC(void) {
162 //    if(CkMyPe() == 0){
163         printBGP_UPC_Counters();
164         //   }
165 }
166
167
168
169 void TraceControlPoints::resetTimings(){
170   totalIdleTime = 0.0;
171   totalEntryMethodTime = 0.0;
172   lastResetTime = CmiWallTimer();
173 }
174
175 TraceControlPoints *localControlPointTracingInstance(){
176   return CkpvAccess(_trace);
177 }
178
179
180
181 extern "C" void traceControlPointsExitFunction() {
182   // The exit function of any Charm++ module must call CkExit() or
183   // the entire exit process will hang if multiple modules are linked.
184   // FIXME: This is NOT a feature. Something needs to be done about this.
185   CkExit();
186 }
187
188 // Initialization of the parallel trace module.
189 void initTraceControlPointsBOC() {
190 #ifdef __BLUEGENE__
191   if (BgNodeRank()==0) {
192 #else
193     if (CkMyRank() == 0) {
194 #endif
195       registerExitFn(traceControlPointsExitFunction);
196     }
197 }
198
199 #include "TraceControlPoints.def.h"
200
201
202 /*@}*/