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