add API to pass application annotation time to tracing framework
[charm.git] / src / ck-perf / trace-bluegene.C
1
2 /**
3  * \addtogroup CkPerf
4 */
5 /*@{*/
6
7
8 #include "charm++.h"
9 #include "envelope.h"
10 #include "trace-common.h"
11 #include "trace-bluegene.h"
12 #include "blue.h"
13 #include "blue_impl.h"
14
15 #undef DEBUGF
16 #define DEBUGF(x)  // CmiPrintf x
17
18 void _createTracebluegene(char** argv)
19 {
20   DEBUGF(("%d createTraceBluegene\n", CkMyPe()));
21   CkpvInitialize(TraceBluegene*, _tracebg);
22   CkpvAccess(_tracebg) = new  TraceBluegene(argv);
23   CkpvAccess(_traces)->addTrace(CkpvAccess(_tracebg));
24   traceBluegeneLinked = 1;
25 }
26
27
28 // this PE must be trace-enabled(in trace-common.C) to be able to do bgPrint()
29 static void writeData(void *data, double t, double recvT, void *ptr)
30 {
31   TraceBluegene *traceBluegene = (TraceBluegene *)ptr;
32   CmiAssert(traceBluegene);
33   traceBluegene->writePrint((char*)data, t);
34 }
35
36 void TraceBluegene::writePrint(char* str, double t){
37   if (pfp == NULL)
38     creatFiles();
39   fprintf(pfp,"[%d] ", CkMyPe());
40   fprintf(pfp,str,t);
41 }
42
43 TraceBluegene::TraceBluegene(char** argv): pfp(NULL)
44 {
45 }
46
47 void TraceBluegene::traceClose() {
48   DEBUGF(("%d TraceBluegene::traceClose\n", CkMyPe()));
49   bgUpdateProj(2);
50   if(pfp != 0)  fclose(pfp);
51   pfp = NULL;
52   CkpvAccess(_traces)->removeTrace(this);
53 }
54
55 TraceBluegene::~TraceBluegene(){
56 }
57
58 CpvExtern(BGMach, bgMach);
59 void TraceBluegene::creatFiles()
60 {
61   char* fname = new char[1024];
62   sprintf(fname, "%sbgPrintFile.%d", cva(bgMach).traceroot?cva(bgMach).traceroot:"", CkMyPe()); 
63   pfp = fopen(fname,"w");     
64   if(pfp==NULL)
65     CmiAbort("Cannot open Bluegene print file for writing.\n");
66 }
67
68 void TraceBluegene::tlineEnd(void** parentLogPtr){
69   if(genTimeLog)
70     *parentLogPtr = (void*)BgLastLog(tTIMELINEREC);
71   else
72     *parentLogPtr = NULL;
73 }
74
75 void TraceBluegene::bgAddTag(const char* str){
76   if (!genTimeLog) return;
77   BgTimeLog * log = BgLastLog(tTIMELINEREC);
78   CmiAssert(log != NULL);
79   log->setName(str);
80 }
81
82 void TraceBluegene::bgDummyBeginExec(const char* name,void** parentLogPtr, int split)
83 {
84   if (genTimeLog) {
85   CmiAssert(parentLogPtr!=NULL);
86   double startTime = BgGetCurTime();
87   BgTimeLog* newLog = BgStartLogByName(tTIMELINEREC, _threadEP, name, startTime, *(BgTimeLog**)parentLogPtr);
88   // if event's mesgID is (-1:-1) and there is no backward dependence
89   // to avoid timestamp correction, set a fake recv time so that it stays here
90   if (*parentLogPtr == NULL)
91     newLog->recvTime = startTime;
92   else {
93     if (split) {
94       newLog->objId = (*(BgTimeLog**)parentLogPtr)->objId;
95       newLog->charm_ep = (*(BgTimeLog**)parentLogPtr)->charm_ep;
96     }
97   }
98   *parentLogPtr = newLog;
99   }
100   startVTimer();
101 }
102
103 void TraceBluegene::bgBeginExec(char* msg, char *name)
104 {
105   startVTimer();
106   if (!genTimeLog) return;
107   BgTimeLog* newLog = new BgTimeLog(msg, name);
108   tTIMELINEREC.logEntryStart(newLog);
109 }
110
111 // mark a new log, which depends on log
112 void TraceBluegene::bgSetInfo(char *msg, const char *name, void **logs, int count)
113 {
114   if (!genTimeLog) return;
115   BgTimeLog * curlog = BgLastLog(tTIMELINEREC);
116   if (name != NULL) curlog->setName(name);
117   for (int i=0; i<count; i++)
118       curlog->addBackwardDep((BgTimeLog*)logs[i]);
119   if (msg) curlog->addMsgBackwardDep(tTIMELINEREC, msg);
120 }
121
122 // mark a new log, which depends on log
123 void TraceBluegene::bgAmpiBeginExec(char *msg, char *name, void **logs, int count)
124 {
125   startVTimer();
126   if (!genTimeLog) return;
127   BgTimeLog * curlog = BgLastLog(tTIMELINEREC);
128   curlog->setName(name);
129   for (int i=0; i<count; i++)
130       curlog->addBackwardDep((BgTimeLog*)logs[i]);
131   if (msg) curlog->addMsgBackwardDep(tTIMELINEREC, msg);
132 }
133
134 void TraceBluegene::bgAmpiLog(unsigned short op, unsigned int dataSize)
135 {
136     if (!genTimeLog) return;
137     BgTimeLog *curlog = BgLastLog(tTIMELINEREC);
138     curlog->mpiOp = op;
139     curlog->mpiSize = dataSize;
140 }
141
142 void TraceBluegene::bgEndExec(int commit)
143 {
144   stopVTimer();
145   if (!genTimeLog) return;
146   if (commit) 
147     BgLogEntryCommit(tTIMELINEREC);
148   else
149     BgEndLastLog(tTIMELINEREC);
150 }
151
152 void TraceBluegene::beginExecute(envelope *e)
153 {
154   if (e==NULL || !genTimeLog) return;
155   BgTimeLog* log = tTIMELINE[tTIMELINE.length()-1];
156   CmiAssert(log!=NULL);
157   log->setCharmEP(e->getEpIdx());
158 }
159
160 void TraceBluegene::beginExecute(int event,int msgType,int ep,int srcPe, int mlen,CmiObjId *idx)
161 {
162   //printf("SET OBJ ID\n");
163   BgTimeLog* log;
164   if(genTimeLog)
165     log = tTIMELINE[tTIMELINE.length()-1];
166   else
167     return;
168   if (idx!=NULL) log->setObjId(idx);
169   log->setCharmEP(ep);
170 }
171
172 void TraceBluegene::getForwardDep(void* log, void** fDepPtr){
173
174   BgTimeLog* cLog = (BgTimeLog*) log;
175   
176   if(cLog->forwardDeps.length() !=1) {
177     cLog->write(stdout);
178     CkAbort("Quitting\n");
179   }
180   *fDepPtr = (void*)(cLog->forwardDeps[0]);
181 }
182
183 void TraceBluegene::getForwardDepForAll(void** logs1, void** logs2, int logsize,void* fDepPtr){
184   if(!genTimeLog) return;
185
186   CmiAssert(logsize>0);
187   BgTimeLog* cLog = (BgTimeLog*)fDepPtr;
188
189   int i=0;
190
191   // find the valid sdag overlap pointer
192   for(i=0;i< logsize+1;i++)
193     if(logs2[i])
194       break;    
195   
196   if (i<logsize+1) {
197     cLog->addBackwardDep((BgTimeLog*)logs2[i]);
198   }
199   // CmiAssert(i<logsize+1);
200   
201   cLog->objId = ((BgTimeLog*)logs1[0])->objId;    // sdag objID
202   for(int j=0;j<logsize;j++)  {
203       cLog->addBackwardDep((BgTimeLog*)(logs1[j]));
204       CmiAssert(cLog->objId == ((BgTimeLog*)logs1[j])->objId);
205   }
206 }
207
208 void TraceBluegene::addBackwardDep(void *log)
209 {
210   if(!genTimeLog || log==NULL) return;
211   BgTimeLog  *parentLogPtr = BgLastLog(tTIMELINEREC);
212   CmiAssert(parentLogPtr);
213   BgAddBackwardDep(parentLogPtr, (BgTimeLog*)log);
214 }
215
216 void TraceBluegene::userBracketEvent(const char* name, double bt, double et, void** parentLogPtr){
217
218   if (!genTimeLog) return;
219
220   BgTimeLog* newLog = new BgTimeLog(_threadEP,name,bt,et);
221   if(*parentLogPtr) {
222     newLog->addBackwardDep(*(BgTimeLog**)parentLogPtr);
223     newLog->objId = (*(BgTimeLog**)parentLogPtr)->objId;        // sdag objID
224   }
225   *parentLogPtr = newLog;
226   CmiAssert(*parentLogPtr != NULL);
227   tTIMELINEREC.logEntryInsert(newLog);
228 }
229
230 void TraceBluegene::userBracketEvent(const char* name, double bt, double et, void** parentLogPtr, CkVec<void*> bgLogList){
231    
232   if (!genTimeLog) return;
233
234   BgTimeLog* newLog = new BgTimeLog(_threadEP,name,bt,et);
235   newLog->addBackwardDeps(bgLogList);
236   CmiAssert(bgLogList.size()>0);
237   newLog->objId = ((BgTimeLog*)bgLogList[0])->objId;   // for sdag
238   *parentLogPtr = newLog;
239   tTIMELINEREC.logEntryInsert(newLog);
240 }
241
242 void TraceBluegene::bgPrint(const char* str){
243   if (CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC)) CmiDisableIsomalloc();
244   double curT = BgGetTime();
245   if (genTimeLog)
246     bgAddProjEvent(strdup(str), -1, curT, writeData, this, BG_EVENT_PRINT);
247   CmiPrintf(str, curT);
248   if (CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC)) CmiEnableIsomalloc();
249 }
250
251 extern "C" void BgPrintf(const char *str)
252 {
253   BgPrint(str);
254 }
255
256 void TraceBluegene::bgMark(const char* str){
257   double curT = BgGetTime();
258   if (genTimeLog)
259     bgAddProjEvent(strdup(str), -1, curT, writeData, this, BG_EVENT_MARK);
260 }
261
262 extern "C" void BgMark(const char *str)
263 {
264   BgMark_(str);
265 }
266
267 extern "C" void BgSetStartEvent()
268 {
269   BgTimeLog* log;
270   if(genTimeLog)
271     log = tTIMELINE[tTIMELINE.length()-1];
272   else
273     return;
274   log->setStartEvent();
275 }
276
277 /*@}*/
278