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