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