Merge branch 'charm' of charmgit:charm into charm
[charm.git] / src / ck-perf / trace-bluegene.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /**
9  * \addtogroup CkPerf
10 */
11 /*@{*/
12
13 #ifndef _TRACE_BLUEGENE_H
14 #define _TRACE_BLUEGENE_H
15
16 #include "trace.h"
17
18 // Bigsim emulator specific tracing subroutines.
19 class TraceBluegene : public Trace {
20
21  private:
22     FILE* pfp;
23  public:
24     TraceBluegene(char** argv);
25     ~TraceBluegene();
26     virtual void setTraceOnPE(int flag) { _traceOn = 1; }  // always on
27     int traceOnPE() { return 1; }
28     void getForwardDep(void* log, void** fDepPtr);
29     void getForwardDepForAll(void** logs1, void** logs2, int logsize,void* fDepPtr);
30     void tlineEnd(void** parentLogPtr);
31     void bgAddTag(const char *str);
32     void bgDummyBeginExec(const char* name,void** parentLogPtr, int split);
33     void bgBeginExec(char* msg, char *str);
34     void bgAmpiBeginExec(char *msg, char *str, void **logs, int count);
35     void bgAmpiLog(unsigned short op, unsigned int size);
36     void bgSetInfo(char *msg, const char *str, void **logs, int count);
37     void bgEndExec(int);
38     virtual void beginExecute(envelope *);
39     virtual void beginExecute(char *) {}
40     virtual void beginExecute(CmiObjId *tid) {}
41     virtual void beginExecute(int event,int msgType,int ep,int srcPe, int mlen,CmiObjId *idx);
42     void addBackwardDep(void *log);
43     void userBracketEvent(int eventID, double bt, double et) {} // from trace.h
44     void userBracketEvent(const char* name, double bt, double et, void** parentLogPtr);
45     void userBracketEvent(const char* name, double bt, double et, void** parentLogPtr, CkVec<void*> bgLogList);
46     void bgPrint(const char* str);
47     void bgMark(char* str);
48     void creatFiles();
49     void writePrint(char *, double t);
50     void traceClose();
51 };
52
53 CkpvExtern(TraceBluegene*, _tracebg);
54 extern int traceBluegeneLinked;
55
56 #if CMK_TRACE_ENABLED
57 #  define _TRACE_BG_ONLY(code) do{ BgGetTime(); if(traceBluegeneLinked && CpvAccess(traceOn)){ code; } resetVTime(); } while(0)
58 #else
59 #  define _TRACE_BG_ONLY(code) /*empty*/
60 #endif
61
62 /* tracing for Blue Gene - before trace projector era */
63 #if CMK_TRACE_ENABLED && CMK_TRACE_IN_CHARM
64 // for Sdag only
65 // fixme - think of better api for tracing sdag code
66 #define BgPrint(x)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgPrint(x))
67 #define BgMark_(x)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgMark(x))
68 #define _TRACE_BG_BEGIN_EXECUTE_NOMSG(x,pLogPtr,split)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgDummyBeginExec(x,pLogPtr,split))
69 #define _TRACE_BG_BEGIN_EXECUTE(msg, str)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgBeginExec(msg, str))
70 #define _TRACE_BG_SET_INFO(msg, str, logs, count)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgSetInfo(msg, str, logs, count))
71 #define _TRACE_BG_AMPI_BEGIN_EXECUTE(msg, str, logs, count)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAmpiBeginExec(msg, str, logs, count))
72 #define _TRACE_BG_END_EXECUTE(commit)   _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgEndExec(commit))
73 #define _TRACE_BG_TLINE_END(pLogPtr) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->tlineEnd(pLogPtr))
74 #define _TRACE_BG_FORWARD_DEPS(logs1,logs2,size,fDep)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->getForwardDepForAll(logs1,logs2, size,fDep))
75 #define _TRACE_BG_ADD_BACKWARD_DEP(log)  _TRACE_BG_ONLY(CkpvAccess(_tracebg)->addBackwardDep(log))
76 #define _TRACE_BG_USER_EVENT_BRACKET(x,bt,et,pLogPtr) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->userBracketEvent(x,bt,et,pLogPtr))
77 #define _TRACE_BGLIST_USER_EVENT_BRACKET(x,bt,et,pLogPtr,bgLogList) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->userBracketEvent(x,bt,et,pLogPtr,bgLogList))
78 #define TRACE_BG_ADD_TAG(str)   _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAddTag(str))
79
80 # define TRACE_BG_AMPI_LOG(op,size)                                     \
81     _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAmpiLog(op,size))
82
83 # define TRACE_BG_AMPI_SUSPEND()     \
84         _TRACE_BG_END_EXECUTE(1); \
85         /* if(CpvAccess(traceOn)) traceSuspend(); */
86
87 # define TRACE_BG_AMPI_START(t, str)  { \
88         void* _bgParentLog = NULL;      \
89         /*_TRACE_BG_TLINE_END(&_bgParentLog);*/ \
90         if(CpvAccess(traceOn) && t) CthTraceResume(t);  \
91         _TRACE_BG_BEGIN_EXECUTE_NOMSG(str, &_bgParentLog, 1);      \
92         }
93
94 # define TRACE_BG_AMPI_BREAK(t, str, event, count, connect)     \
95         {       \
96         void *curLog;    /* store current log in timeline */    \
97         _TRACE_BG_TLINE_END(&curLog);   \
98         TRACE_BG_AMPI_SUSPEND();        \
99         /* TRACE_BG_AMPI_START(t, str);  */  \
100         void * _bgParentLog = NULL;      \
101          _TRACE_BG_BEGIN_EXECUTE_NOMSG(str, &_bgParentLog, 1);  \
102         for(int i=0;i<count;i++) {      \
103                 _TRACE_BG_ADD_BACKWARD_DEP(((void**)event)[i]);      \
104         }       \
105         if (connect) _TRACE_BG_ADD_BACKWARD_DEP(curLog);      \
106         }
107         
108
109 #define TRACE_BG_AMPI_WAITALL(reqs)     \
110         {       \
111         /* TRACE_BG_AMPI_SUSPEND(); */  \
112         CthThread th = getAmpiInstance(MPI_COMM_WORLD)->getThread();    \
113         TRACE_BG_AMPI_BREAK(th, "AMPI_WAITALL", NULL, 0, 0);    \
114         _TRACE_BG_ADD_BACKWARD_DEP(curLog);     \
115         for(int i=0;i<count;i++) {      \
116           if (request[i] == MPI_REQUEST_NULL) continue; \
117           void *log = (*reqs)[request[i]]->event;       \
118           _TRACE_BG_ADD_BACKWARD_DEP(log);      \
119         }       \
120         }
121 extern "C" void BgSetStartEvent();
122 #else
123 # define BgPrint(x)  
124 # define BgMark_(x)  
125 #define _TRACE_BG_BEGIN_EXECUTE_NOMSG(x,pLogPtr,split)
126 #define _TRACE_BG_BEGIN_EXECUTE(msg, str)
127 #define _TRACE_BG_SET_INFO(msg, str, logs, count) 
128 #define _TRACE_BG_AMPI_BEGIN_EXECUTE(msg, str, logs, count)
129 #define _TRACE_BG_END_EXECUTE(commit)
130 #define _TRACE_BG_TLINE_END(x)  
131 #define _TRACE_BG_FORWARD_DEP(logs1,logs2,size,fDep)
132 #define _TRACE_BG_BACKWARD_DEP(log)     
133 #define _TRACE_BG_USER_EVENT_BRACKET(x,bt,et,pLogPtr)
134 #define _TRACE_BGLIST_USER_EVENT_BRACKET(x,bt,et,pLogPtr,bgLogList)
135 #define _TRACE_BG_ADD_TAG(str)
136         
137 # define TRACE_BG_AMPI_LOG(op, size)
138 # define TRACE_BG_AMPI_SUSPEND()
139 # define TRACE_BG_AMPI_RESUME(t, msg, str, log)
140 # define TRACE_BG_AMPI_START(t, str)
141 # define TRACE_BG_NEWSTART(t, str, events, count)
142 # define TRACE_BG_AMPI_BREAK(t, str, event, count)
143 # define TRACE_BG_AMPI_WAITALL(reqs)
144 # define TRACE_BG_AMPI_SET_SIZE(size)
145 #endif   /* CMK_TRACE_IN_CHARM */
146
147 extern "C" void BgPrintf(const char *str);
148 extern "C" void BgMark(char *str);
149
150 #endif
151
152 /*@}*/