pup machineInfo byte by byte instead of by size, to support backward compatibility...
[charm.git] / src / langs / bluegene / bigsim_read.C
1 #include "blue.h"
2 #include "blue_impl.h"
3 #include "blue_types.h"
4 #include "bigsim_logs.h"
5 #include "assert.h"
6
7 BgTimeLineRec* currTline = NULL;
8 int currTlineIdx=0;
9 const char* traceFileName="bgTrace";
10
11 //Used for parallel file I/O
12 int BgReadProc(int procNum, int numWth ,int numEmulatingPes, int totalWorkerProcs, int* allNodeOffsets, BgTimeLineRec& tlinerec){
13
14   currTline = &tlinerec;
15
16   /*Right now works only for cyclicMapInfo - needs a more general scheme*/
17   int arrayIdx, fileNum;
18   int arrayID = CyclicMapInfo::FileOffset(procNum, numWth, numEmulatingPes, totalWorkerProcs, fileNum, arrayIdx);
19   int fileOffset = allNodeOffsets[arrayIdx];
20
21    //   CmiPrintf("nodeNum: %d arrayId:%d numNodes:%d numPes:%d\n",nodeNum,arrayID,numNodes,numPes);
22  
23   char fName[20];
24   sprintf(fName,"%s%d",traceFileName,fileNum);
25   FILE*  f = fopen(fName,"rb");
26   if (f == NULL) {
27     printf("Error> Open failed with %s. \n", fName);
28     return -1;
29   }
30 //  PUP::fromDisk p(f);
31   PUP::fromDisk pd(f);
32   PUP::machineInfo machInfo;
33   //pd((char *)&machInfo, sizeof(machInfo));
34   pd | machInfo;
35   if (!machInfo.valid()) CmiAbort("Invalid machineInfo on disk file!\n");
36   PUP::xlater p(machInfo, pd);
37
38   fseek(f,fileOffset,SEEK_SET);
39   tlinerec.pup(p);
40   fclose(f);
41
42   currTline = NULL;
43   return fileNum;
44 }
45
46 // This version only reads in a part (window) of the time line
47 int BgReadProcWindow(int procNum, int numWth ,int numEmulatingPes, int totalWorkerProcs, int* allNodeOffsets, BgTimeLineRec& tlinerec,
48                      int& fileLoc, int& totalTlineLength, int firstLog, int numLogs) {
49
50   int firstLogToRead, numLogsToRead, tLineLength;
51
52   currTline = &tlinerec;
53   
54   /*Right now works only for cyclicMapInfo - needs a more general scheme*/
55   int arrayIdx, fileNum;
56   int arrayID = CyclicMapInfo::FileOffset(procNum, numWth, numEmulatingPes, totalWorkerProcs, fileNum, arrayIdx);
57   int fileOffset = allNodeOffsets[arrayIdx];
58
59   //  CmiPrintf("   BgReadProc: fileOffset=%d arrayID=%d nodeNum=%d numNodes=%d fileNum=%d\n", fileOffset, arrayID, nodeNum, numNodes, fileNum);
60
61   char fName[20];
62   sprintf(fName,"bgTrace%d",fileNum);
63   FILE* f = fopen(fName,"r");
64   if (f == NULL) {
65     printf("Error> Open failed with %s. \n", fName);
66     return -1;
67   }
68   PUP::fromDisk pd(f);
69   PUP::machineInfo machInfo;
70   //pd((char *)&machInfo, sizeof(machInfo));
71   pd | machInfo;
72   if (!machInfo.valid()) CmiAbort("Invalid machineInfo on disk file!\n");
73   PUP::xlater p(machInfo, pd);
74
75   //  CmiPrintf("BgReadProc: procNum=%d, ftell=%d\n", procNum, ftell(f));
76
77   if (firstLog == 0) {
78     fseek(f, fileOffset, SEEK_SET);
79   } else {
80     fseek(f, fileLoc, 0);
81   }
82   firstLogToRead = firstLog;
83   if (numLogs < 1) {
84     numLogsToRead = 0x7FFFFFFF;
85   } else {
86     numLogsToRead = numLogs;
87   }
88   if (firstLog != 0) {
89     tLineLength = totalTlineLength;
90   } else {
91     tLineLength = -1;
92   }
93   //  CmiPrintf("   BgReadProc: procNum=%d, ftell=%d\n", procNum, ftell(f));
94   tlinerec.winPup(p, firstLogToRead, numLogsToRead, tLineLength);
95   if (firstLog == 0) {
96     totalTlineLength = tLineLength;
97   }
98   //  CmiPrintf("      BgReadProc: procNum=%d, ftell=%d\n", procNum, ftell(f));
99   fileLoc = ftell(f);
100   fclose(f);
101   currTline = NULL;
102
103   return fileNum;
104 }
105
106 // user has to remember to free allProcOffsets
107 int* BgLoadOffsets(int totalProcs, int numPes){
108
109   int* allProcOffsets = new int[totalProcs];
110   int arrayOffset=0, procsInPe;
111   char d[128];
112
113   PUP::machineInfo machInfo;
114   for (int i=0; i<numPes; i++){
115     sprintf(d,"%s%d",traceFileName,i);
116     FILE *f = fopen(d,"rb");
117     if (f == NULL) {
118       CmiPrintf("BgLoadOffsets: can not open file %s!\n", d);
119       CmiAbort("BgLoadOffsets failed!\n");
120     }  
121     PUP::fromDisk pd(f);
122     //pd((char *)&machInfo, sizeof(machInfo));
123     pd | machInfo;
124     PUP::xlater p(machInfo, pd);
125     if (!machInfo.valid()) CmiAbort("Invalid machineInfo on disk file!\n");
126     p|procsInPe;
127
128     p(allProcOffsets+arrayOffset,procsInPe);
129     arrayOffset += procsInPe;
130     fclose(f);
131   }
132   return  allProcOffsets;
133 }
134
135 static int thread_ep = -1;
136
137 int BgLoadTraceSummary(const char *fname, int &totalWorkerProcs, int &numX, int &numY, int &numZ, int &numCth, int &numWth, int &numEmulatingPes)
138 {
139   BGMach  bgMach ;
140   PUP::machineInfo machInfo;
141
142   FILE* f = fopen(fname,"rb");
143   if (f == NULL) {
144     printf("Error> Open failed with %s. \n", fname);
145     return -1;
146   }
147
148   PUP::fromDisk pd(f);
149 //  pd((char *)&machInfo, sizeof(machInfo));    // load machine info
150   pd | machInfo;
151   if (!machInfo.valid()) CmiAbort("Invalid machineInfo on disk file!\n");
152   PUP::xlater p(machInfo, pd);
153   p|totalWorkerProcs;
154   p|bgMach;
155   numX = bgMach.x;
156   numY = bgMach.y;
157   numZ = bgMach.z;
158   numCth = bgMach.numCth;
159   numWth = bgMach.numWth;
160   p|numEmulatingPes;
161
162   bglog_version = 0;
163   if (!feof(f)) p|bglog_version;
164
165   if (!feof(f)) p|thread_ep;    // EP (CthResumeBigSimThreadIdx) to identify thread resume events
166
167   fclose(f);
168   return 0;
169 }
170
171
172 // return CthResumeBigSimThreadIdx, the thread resume event EP number
173 int BgLogGetThreadEP()
174 {
175   return thread_ep;
176 }
177