quick implementation to make projections to have object id for array elements. last...
[charm.git] / src / ck-perf / trace.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #ifndef _TRACE_H
9 #define _TRACE_H
10
11 class envelope;
12
13 /**
14  \defgroup CkPerf  Charm++ Trace Module
15 */
16 /*@{*/
17
18 // An additional interface for summary data
19 extern "C" void traceClearEps();
20
21 extern double CmiTraceTimer();
22
23 // Base class of all tracing strategies.
24 // 
25 class Trace {
26   public:
27     // turn trace on/off, note that charm will automatically call traceBegin()
28     // at the beginning of every run unless the command line option "+traceoff"
29     // is specified
30     virtual void traceBegin() {}
31     virtual void traceEnd() {}
32     // registers user event trace module returns int identifier 
33     virtual int traceRegisterUserEvent(const char* eventName, int e) { return 0; }
34     // a user event has just occured
35     virtual void userEvent(int eventID) {}
36     // a pair of begin/end user event has just occured
37     virtual void userBracketEvent(int eventID, double bt, double et) {}
38     // creation of message(s)
39     virtual void creation(envelope *, int epIdx, int num=1) {}
40     virtual void creationDone(int num=1) {}
41     // ???
42     virtual void messageRecv(char *env, int pe) {}
43     // **************************************************************
44     // begin/end execution of a Charm++ entry point
45     // NOTE: begin/endPack and begin/endUnpack can be called in between
46     //       a beginExecute and its corresponding endExecute.
47     virtual void beginExecute(envelope *) {}
48     virtual void beginExecute(CmiObjId *tid) {}
49     virtual void beginExecute(
50       int event,   // event type defined in trace-common.h
51       int msgType, // message type
52       int ep,      // Charm++ entry point (will correspond to sts file) 
53       int srcPe,   // Which PE originated the call
54       int ml,      // message size
55       CmiObjId* idx)    // index
56     { }
57     virtual void endExecute(void) {}
58     // begin/end idle time for this pe
59     virtual void beginIdle(void) {}
60     virtual void endIdle(void) {}
61     // begin/end the process of packing a message (to send)
62     virtual void beginPack(void) {}
63     virtual void endPack(void) {}
64     // begin/end the process of unpacking a message (can occur before calling
65     // a entry point or during an entry point when 
66     virtual void beginUnpack(void) {}
67     virtual void endUnpack(void) {}
68     // ???
69     virtual void enqueue(envelope *) {}
70     virtual void dequeue(envelope *) {}
71     // begin/end of execution
72     virtual void beginComputation(void) {}
73     virtual void endComputation(void) {}
74     // clear all data collected for entry points
75     virtual void traceClearEps() {}
76     // write the summary sts file for this trace
77     virtual void traceWriteSts() {}
78     // do any clean-up necessary for tracing
79     virtual void traceClose() {}
80 };
81
82 #define ALLDO(x) for (int i=0; i<length(); i++) traces[i]->x
83
84 /// Array of Traces modules,  every event raised will go through every Trace module.
85 class TraceArray {
86 private:
87   CkVec<Trace *>  traces;
88   int n;
89 public:
90     TraceArray(): n(0) {}
91     inline void addTrace(Trace *tr) { traces.push_back(tr); n++;}
92     inline void removeTrace(Trace *tr) {    // remove a Trace from TraceArray
93         int i;
94         for (i=0; i<n; i++) if (tr == traces[i]) break;
95         CmiAssert(i<n);
96         traces[i] = NULL;
97         n--;
98     }
99     inline void clearTrace() {    // remove void Trace from TraceArray
100         int len = traces.length();
101         int removed = 0;
102         for (int i=0; i<len; i++) {
103           if (traces[i] == NULL) { traces.remove(i-removed); removed++; }
104         }
105     }
106     inline const int length() const { return n; }
107
108     inline void userEvent(int e) { ALLDO(userEvent(e));}
109     inline void userBracketEvent(int e,double bt, double et) {ALLDO(userBracketEvent(e,bt,et));}
110     
111     /* Creation needs to access _entryTable, so moved into trace-common.C */
112     void creation(envelope *env, int ep, int num=1);
113     
114     inline void creationDone(int num=1) { ALLDO(creationDone(num)); }
115     inline void beginExecute(envelope *env) {ALLDO(beginExecute(env));}
116     inline void beginExecute(CmiObjId *tid) {ALLDO(beginExecute(tid));}
117     inline void beginExecute(int event,int msgType,int ep,int srcPe, int mlen,CmiObjId *idx=NULL) {ALLDO(beginExecute(event, msgType, ep, srcPe, mlen,idx));}
118     inline void endExecute(void) {ALLDO(endExecute());}
119     inline void messageRecv(char *env, int pe) {ALLDO(messageRecv(env, pe));}
120     inline void beginIdle(void) {ALLDO(beginIdle());}
121     inline void endIdle(void) {ALLDO(endIdle());}
122     inline void beginPack(void) {ALLDO(beginPack());}
123     inline void endPack(void) {ALLDO(endPack());}
124     inline void beginUnpack(void) {ALLDO(beginUnpack());}
125     inline void endUnpack(void) {ALLDO(endUnpack());}
126     inline void enqueue(envelope *e) {ALLDO(enqueue(e));}
127     inline void dequeue(envelope *e) {ALLDO(dequeue(e));}
128     inline void beginComputation(void) {ALLDO(beginComputation());}
129     inline void endComputation(void) {ALLDO(endComputation());}
130     inline int traceRegisterUserEvent(const char*x, int evt) {
131           int eno = 0;
132           for (int i=0; i<length(); i++) {
133             int e = traces[i]->traceRegisterUserEvent(x, evt);
134             if (e) eno = e;
135           }
136           return eno;
137     }  
138     inline void traceClearEps() {ALLDO(traceClearEps());}
139     inline void traceWriteSts() {ALLDO(traceWriteSts());}
140     inline void traceClose() {ALLDO(traceClose()); clearTrace();}
141     inline void traceBegin() {ALLDO(traceBegin());}
142     inline void traceEnd() {ALLDO(traceEnd());}
143 };
144
145 CkpvExtern(TraceArray*, _traces);
146
147 extern "C" {
148 #include "conv-trace.h"
149 }
150
151 // traceOnPe controls if charm pe will generate trace logs
152 #if CMK_TRACE_IN_CHARM
153 CkpvExtern(int, traceOnPe);
154 #  define TRACE_CHARM_PE()  (CkpvAccess(traceOnPe))
155 #else
156 #  define TRACE_CHARM_PE()  (CkMyRank() != CkMyNodeSize())
157 #endif
158 #ifndef CMK_OPTIMIZE
159 #  define _TRACE_ONLY(code) do{if(CpvAccess(traceOn)&&TRACE_CHARM_PE()){ code; }} while(0)
160 #else
161 #  define _TRACE_ONLY(code) /*empty*/
162 #endif
163
164 #define _TRACE_USER_EVENT(x) _TRACE_ONLY(CkpvAccess(_traces)->userEvent(x))
165 #define _TRACE_USER_EVENT_BRACKET(x,bt,et) _TRACE_ONLY(CkpvAccess(_traces)->userBracketEvent(x,bt,et))
166 #define _TRACE_CREATION_1(env) _TRACE_ONLY(CkpvAccess(_traces)->creation(env,env->getEpIdx()))
167 #define _TRACE_CREATION_DETAILED(env,ep) _TRACE_ONLY(CkpvAccess(_traces)->creation(env,ep))
168 #define _TRACE_CREATION_N(env, num) _TRACE_ONLY(CkpvAccess(_traces)->creation(env,env->getEpIdx(), num))
169 #define _TRACE_CREATION_DONE(num) _TRACE_ONLY(CkpvAccess(_traces)->creationDone(num))
170 #define _TRACE_BEGIN_EXECUTE(env) _TRACE_ONLY(CkpvAccess(_traces)->beginExecute(env))
171 #define _TRACE_BEGIN_EXECUTE_DETAILED(evt,typ,ep,src,mlen,idx) \
172         _TRACE_ONLY(CkpvAccess(_traces)->beginExecute(evt,typ,ep,src,mlen,idx))
173 #define _TRACE_END_EXECUTE() _TRACE_ONLY(CkpvAccess(_traces)->endExecute())
174 #define _TRACE_MESSAGE_RECV(env, pe) _TRACE_ONLY(CkpvAccess(_traces)->messageRecv(env, pe))
175 #define _TRACE_BEGIN_IDLE() _TRACE_ONLY(CkpvAccess(_traces)->beginIdle())
176 #define _TRACE_END_IDLE() _TRACE_ONLY(CkpvAccess(_traces)->endIdle())
177 #define _TRACE_BEGIN_PACK() _TRACE_ONLY(CkpvAccess(_traces)->beginPack())
178 #define _TRACE_END_PACK() _TRACE_ONLY(CkpvAccess(_traces)->endPack())
179 #define _TRACE_BEGIN_UNPACK() _TRACE_ONLY(CkpvAccess(_traces)->beginUnpack())
180 #define _TRACE_END_UNPACK() _TRACE_ONLY(CkpvAccess(_traces)->endUnpack())
181 #define _TRACE_BEGIN_COMPUTATION() _TRACE_ONLY(CkpvAccess(_traces)->beginComputation())
182 #define _TRACE_END_COMPUTATION() _TRACE_ONLY(CkpvAccess(_traces)->endComputation())
183 #define _TRACE_ENQUEUE(env) _TRACE_ONLY(CkpvAccess(_traces)->enqueue(env))
184 #define _TRACE_DEQUEUE(env) _TRACE_ONLY(CkpvAccess(_traces)->dequeue(env))
185
186 #endif
187
188
189 /*@}*/
190