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