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