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