add in log summary the meaning of the thread_resume_ep, so that loadlog can tell...
[charm.git] / src / langs / bluegene / bigsim_api.C
1
2 #include "blue.h"
3 #include "blue_impl.h"
4
5 // BigSim log API
6
7 int BgIsInALog(BgTimeLineRec &tlinerec)
8 {
9   if (tlinerec.bgCurLog) return 1;
10   else return 0;
11 }
12
13 // returns the last log in timeline
14 BgTimeLog *BgLastLog(BgTimeLineRec &tlinerec)
15 {
16   CmiAssert(tlinerec.length() > 0);
17   return tlinerec[tlinerec.length()-1];
18 }
19
20 // add deplog as backward dep of curlog, i.e. deplog <= curlog
21 void BgAddBackwardDep(BgTimeLog *curlog, BgTimeLog* deplog)
22 {
23   curlog->addBackwardDep(deplog);
24 }
25
26 BgTimeLog *BgStartLogByName(BgTimeLineRec &tlinerec, int ep, char *name, double starttime, BgTimeLog *prevLog)
27 {
28   BgTimeLog* newLog = new BgTimeLog(ep, name, starttime);
29   if (prevLog) {
30     newLog->addBackwardDep(prevLog);
31   }
32   tlinerec.logEntryStart(newLog);
33   return newLog;
34 }
35
36 void BgEndLastLog(BgTimeLineRec &tlinerec)
37 {
38   tlinerec.logEntryClose();
39 }
40
41 //
42 // BigSim APIs for writing trace log files
43 //
44
45 //  dump timeline into ASCII format
46 void BgWriteThreadTimeLine(char *pgm, int x, int y, int z, int th, BgTimeLine &tline)
47 {
48   char *fname = (char *)malloc(strlen(pgm)+100);
49   sprintf(fname, "%s-%d-%d-%d.%d.log", pgm, x,y,z,th);
50   FILE *fp = fopen(fname, "w");
51   CmiAssert(fp!=NULL);
52   for (int i=0; i<tline.length(); i++) {
53     fprintf(fp, "[%d] ", i);
54     tline[i]->write(fp);
55   }
56   fclose(fp);
57   free(fname);
58 }
59
60 // write bgTrace file
61 void BgWriteTraceSummary(int numPes, int x, int y, int z, int numWth, int numCth, char *traceroot)
62 {
63   char* d = new char[512];
64   BGMach bgMach;
65
66   const PUP::machineInfo &machInfo = PUP::machineInfo::current();
67
68   if (!traceroot) traceroot=(char*)"";
69   sprintf(d, "%sbgTrace", traceroot);
70   FILE *f = fopen(d,"w");
71   if(f==NULL) {
72       CmiPrintf("Creating trace file %s  failed\n", d);
73       CmiAbort("BG> Abort");
74   }
75   PUP::toDisk p(f);
76   p((char *)&machInfo, sizeof(machInfo));
77   int nlocalProcs = x*y*z*numWth;               // ???
78   p|nlocalProcs;
79   bgMach.x = x;
80   bgMach.y = y;
81   bgMach.z = z;
82   bgMach.numWth = numWth;
83   bgMach.numCth = numCth;
84   p|(BGMach &)bgMach;
85   p|numPes;
86   p|bglog_version;
87
88   printf("BgWriteTraceSummary> Number is numX:%d numY:%d numZ:%d numCth:%d numWth:%d numPes:%d totalProcs:%d bglog_ver:%d\n",bgMach.x,bgMach.y,bgMach.z,bgMach.numCth,bgMach.numWth,numPes,nlocalProcs,bglog_version);
89
90   fclose(f);
91 }
92
93 // write bgTrace<seqno> file with an array of timelines
94 //
95 // note that target processors are mapped to bgTrace* files in round-robin 
96 // fashion
97 // that is "tlinerecs" should contains timelines of target processors of 
98 //   i, i+p, i+2p ..., where p is the number of emulating processors, i.e.
99 //   the number of bgTrace* files to write.
100 void BgWriteTimelines(int seqno, BgTimeLineRec **tlinerecs, int nlocalProcs, char *traceroot)
101 {
102   int *procOffsets = new int[nlocalProcs];
103
104   char *d = new char[512];
105   sprintf(d, "%sbgTrace%d", traceroot?traceroot:"", seqno); 
106   FILE *f = fopen(d,"w");
107   PUP::toDisk p(f);
108   const PUP::machineInfo &machInfo = PUP::machineInfo::current();
109
110   p((char *)&machInfo, sizeof(machInfo));       // machine info
111   p|nlocalProcs;
112
113   // CmiPrintf("Timelines are: \n");
114   int procTablePos = ftell(f);
115   int procTableSize = (nlocalProcs)*sizeof(int);
116   fseek(f,procTableSize,SEEK_CUR); 
117
118 //  int numNodes = nlocalProcs / numWth;
119   for(int i=0;i<nlocalProcs;i++) {
120     BgTimeLineRec *t = tlinerecs[i];
121     procOffsets[i] = ftell(f);
122     t->pup(p);
123   }
124   
125   fseek(f,procTablePos,SEEK_SET);
126   p(procOffsets,nlocalProcs);
127   fclose(f);
128
129   CmiPrintf("BgWriteTimelines> Wrote to disk for %d simulated nodes. \n", nlocalProcs);
130   delete [] d;
131 }
132
133 void BgWriteTimelines(int seqno, BgTimeLineRec *tlinerecs, int nlocalProcs, char *traceroot)
134 {
135   BgTimeLineRec **tlines = new BgTimeLineRec*[nlocalProcs];
136   for (int i=0; i<nlocalProcs; i++)
137     tlines[i] = &tlinerecs[i];
138
139   BgWriteTimelines(seqno, tlines, nlocalProcs, traceroot);
140   delete [] tlines;
141 }
142
143