00001
00005
00006 #ifndef _TRACE_BIGSIM_H
00007 #define _TRACE_BIGSIM_H
00008
00009 #include "trace.h"
00010
00011
00012 class TraceBluegene : public Trace {
00013
00014 private:
00015 FILE* pfp;
00016 public:
00017 TraceBluegene(char** argv);
00018 ~TraceBluegene();
00019 virtual void setTraceOnPE(int flag) { _traceOn = 1; }
00020 int traceOnPE() { return 1; }
00021 void getForwardDep(void* log, void** fDepPtr);
00022 void getForwardDepForAll(void** logs1, void** logs2, int logsize,void* fDepPtr);
00023 void tlineEnd(void** parentLogPtr);
00024 void bgAddTag(const char *str);
00025 void bgDummyBeginExec(const char* name,void** parentLogPtr, int split);
00026 void bgBeginExec(char* msg, char *str);
00027 void bgAmpiBeginExec(char *msg, char *str, void **logs, int count);
00028 void bgAmpiLog(unsigned short op, unsigned int size);
00029 void bgSetInfo(char *msg, const char *str, void **logs, int count);
00030 void bgEndExec(int);
00031 virtual void beginExecute(envelope *);
00032 virtual void beginExecute(char *) {}
00033 virtual void beginExecute(CmiObjId *tid) {}
00034 virtual void beginExecute(int event,int msgType,int ep,int srcPe, int mlen,CmiObjId *idx);
00035 void addBackwardDep(void *log);
00036 void userBracketEvent(int eventID, double bt, double et) {}
00037 void userBracketEvent(const char* name, double bt, double et, void** parentLogPtr);
00038 void userBracketEvent(const char* name, double bt, double et, void** parentLogPtr, CkVec<void*> bgLogList);
00039 void bgPrint(const char* str);
00040 void bgMark(char* str);
00041 void creatFiles();
00042 void writePrint(char *, double t);
00043 void traceClose();
00044 };
00045
00046 CkpvExtern(TraceBluegene*, _tracebg);
00047 extern int traceBluegeneLinked;
00048
00049 #if CMK_TRACE_ENABLED
00050 # define _TRACE_BG_ONLY(code) do{ BgGetTime(); if(traceBluegeneLinked && CpvAccess(traceOn)){ code; } resetVTime(); } while(0)
00051 #else
00052 # define _TRACE_BG_ONLY(code)
00053 #endif
00054
00055
00056 #if CMK_TRACE_ENABLED && CMK_TRACE_IN_CHARM
00057
00058
00059 #define BgPrint(x) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgPrint(x))
00060 #define BgMark_(x) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgMark(x))
00061 #define _TRACE_BG_BEGIN_EXECUTE_NOMSG(x,pLogPtr,split) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgDummyBeginExec(x,pLogPtr,split))
00062 #define _TRACE_BG_BEGIN_EXECUTE(msg, str) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgBeginExec(msg, str))
00063 #define _TRACE_BG_SET_INFO(msg, str, logs, count) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgSetInfo(msg, str, logs, count))
00064 #define _TRACE_BG_AMPI_BEGIN_EXECUTE(msg, str, logs, count) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAmpiBeginExec(msg, str, logs, count))
00065 #define _TRACE_BG_END_EXECUTE(commit) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgEndExec(commit))
00066 #define _TRACE_BG_TLINE_END(pLogPtr) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->tlineEnd(pLogPtr))
00067 #define _TRACE_BG_FORWARD_DEPS(logs1,logs2,size,fDep) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->getForwardDepForAll(logs1,logs2, size,fDep))
00068 #define _TRACE_BG_ADD_BACKWARD_DEP(log) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->addBackwardDep(log))
00069 #define _TRACE_BG_USER_EVENT_BRACKET(x,bt,et,pLogPtr) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->userBracketEvent(x,bt,et,pLogPtr))
00070 #define _TRACE_BGLIST_USER_EVENT_BRACKET(x,bt,et,pLogPtr,bgLogList) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->userBracketEvent(x,bt,et,pLogPtr,bgLogList))
00071 #define TRACE_BG_ADD_TAG(str) _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAddTag(str))
00072
00073 # define TRACE_BG_AMPI_LOG(op,size) \
00074 _TRACE_BG_ONLY(CkpvAccess(_tracebg)->bgAmpiLog(op,size))
00075
00076 # define TRACE_BG_AMPI_SUSPEND() \
00077 _TRACE_BG_END_EXECUTE(1); \
00078
00079
00080 # define TRACE_BG_AMPI_START(t, str) { \
00081 void* _bgParentLog = NULL; \
00082 \
00083 if(CpvAccess(traceOn) && t) CthTraceResume(t); \
00084 _TRACE_BG_BEGIN_EXECUTE_NOMSG(str, &_bgParentLog, 1); \
00085 }
00086
00087 # define TRACE_BG_AMPI_BREAK(t, str, event, count, connect) \
00088 { \
00089 void *curLog; \
00090 _TRACE_BG_TLINE_END(&curLog); \
00091 TRACE_BG_AMPI_SUSPEND(); \
00092 \
00093 void * _bgParentLog = NULL; \
00094 _TRACE_BG_BEGIN_EXECUTE_NOMSG(str, &_bgParentLog, 1); \
00095 for(int i=0;i<count;i++) { \
00096 _TRACE_BG_ADD_BACKWARD_DEP(((void**)event)[i]); \
00097 } \
00098 if (connect) _TRACE_BG_ADD_BACKWARD_DEP(curLog); \
00099 }
00100
00101
00102 #define TRACE_BG_AMPI_WAITALL(reqs) \
00103 { \
00104 \
00105 CthThread th = getAmpiInstance(MPI_COMM_WORLD)->getThread(); \
00106 TRACE_BG_AMPI_BREAK(th, "AMPI_WAITALL", NULL, 0, 0); \
00107 _TRACE_BG_ADD_BACKWARD_DEP(curLog); \
00108 for(int i=0;i<count;i++) { \
00109 if (request[i] == MPI_REQUEST_NULL) continue; \
00110 void *log = (*reqs)[request[i]]->event; \
00111 _TRACE_BG_ADD_BACKWARD_DEP(log); \
00112 } \
00113 }
00114 extern "C" void BgSetStartEvent();
00115 #else
00116 # define BgPrint(x)
00117 # define BgMark_(x)
00118 #define _TRACE_BG_BEGIN_EXECUTE_NOMSG(x,pLogPtr,split)
00119 #define _TRACE_BG_BEGIN_EXECUTE(msg, str)
00120 #define _TRACE_BG_SET_INFO(msg, str, logs, count)
00121 #define _TRACE_BG_AMPI_BEGIN_EXECUTE(msg, str, logs, count)
00122 #define _TRACE_BG_END_EXECUTE(commit)
00123 #define _TRACE_BG_TLINE_END(x)
00124 #define _TRACE_BG_FORWARD_DEP(logs1,logs2,size,fDep)
00125 #define _TRACE_BG_BACKWARD_DEP(log)
00126 #define _TRACE_BG_USER_EVENT_BRACKET(x,bt,et,pLogPtr)
00127 #define _TRACE_BGLIST_USER_EVENT_BRACKET(x,bt,et,pLogPtr,bgLogList)
00128 #define _TRACE_BG_ADD_TAG(str)
00129
00130 # define TRACE_BG_AMPI_LOG(op, size)
00131 # define TRACE_BG_AMPI_SUSPEND()
00132 # define TRACE_BG_AMPI_RESUME(t, msg, str, log)
00133 # define TRACE_BG_AMPI_START(t, str)
00134 # define TRACE_BG_NEWSTART(t, str, events, count)
00135 # define TRACE_BG_AMPI_BREAK(t, str, event, count)
00136 # define TRACE_BG_AMPI_WAITALL(reqs)
00137 # define TRACE_BG_AMPI_SET_SIZE(size)
00138 #endif
00139
00140 extern "C" void BgPrintf(const char *str);
00141 extern "C" void BgMark(char *str);
00142
00143 #endif
00144