c024c35b488cc76d05d1a90b5f34457637f43949
[charm.git] / src / langs / bluegene / bigsim_record.C
1
2 #include <stdio.h>
3
4 #include "blue.h"
5 #include "bigsim_record.h"
6 #include "blue_impl.h"
7
8 BgMessageRecorder::BgMessageRecorder(FILE * f_, int node) :f(f_) {
9   nodelevel = node;
10   fwrite(&nodelevel, sizeof(int),1,f);
11
12   // write processor data
13   int d = BgGetGlobalWorkerThreadID();
14   int mype = d;
15   fwrite(&d, sizeof(int),1,f);
16
17   nodeInfo *myNode = cta(threadinfo)->myNode;
18   d = myNode->x;
19   fwrite(&d, sizeof(int), 1, f);
20   d = myNode->y;
21   fwrite(&d, sizeof(int), 1, f);
22   d = myNode->z;
23   fwrite(&d, sizeof(int), 1, f);
24
25   d = BgGetThreadID();
26   fwrite(&d, sizeof(int), 1, f);
27
28   d = BgNumNodes();
29   fwrite(&d, sizeof(int), 1, f);
30
31   d = BgNumNodes()*BgGetNumWorkThread();
32   fwrite(&d, sizeof(int), 1, f);
33  
34   d = cva(bgMach).x;
35   fwrite(&d, sizeof(int), 1, f);
36   d = cva(bgMach).y;
37   fwrite(&d, sizeof(int), 1, f);
38   d = cva(bgMach).z;
39   fwrite(&d, sizeof(int), 1, f);
40  
41   if (nodelevel == 1 && mype % BgGetNumWorkThread() == 0) {
42     write_nodeinfo();
43   }
44 }
45
46 void BgMessageRecorder::write_nodeinfo()
47 {
48   int mype = BgGetGlobalWorkerThreadID();
49   int mynode = mype / BgGetNumWorkThread();
50   char fName[128];
51   sprintf(fName,"bgnode_%06d.log",mynode);
52   FILE *fp = fopen(fName, "w");
53   fprintf(fp, "%d %d\n", mype, mype + BgGetNumWorkThread()-1);
54   fclose(fp);
55 }
56
57 BgMessageReplay::BgMessageReplay(FILE * f_, int node) :f(f_) {
58   nodelevel = node;
59   lcount = rcount = 0;
60
61   int d;
62   fread(&d, sizeof(int), 1, f);
63   if (nodelevel != d) {
64     CmiPrintf("BgReplay> Fatal error: can not replay %s logs.\n", d?"node level":"processor level");
65     CmiAbort("BgReplay error");
66   }
67
68   fread(&d, sizeof(int), 1, f);
69   BgSetGlobalWorkerThreadID(d);
70
71   nodeInfo *myNode = cta(threadinfo)->myNode;
72   fread(&d, sizeof(int), 1, f);
73   myNode->x = d;
74   fread(&d, sizeof(int), 1, f);
75   myNode->y = d;
76   fread(&d, sizeof(int), 1, f);
77   myNode->z = d;
78
79   fread(&d, sizeof(int), 1, f);
80   BgSetThreadID(d);
81   if (nodelevel == 0 && d != 0)
82     CmiAbort("BgReplay> Fatal error: can not replay processor level log of rank other than 0.");
83   fread(&d, sizeof(int), 1, f);
84   BgSetNumNodes(d);
85   fread(&d, sizeof(int), 1, f);
86   if (nodelevel == 1 && d/BgNumNodes() != BgGetNumWorkThread())
87     CmiAbort("BgReplay> Fatal error: the number of worker threads is not the same as in the logs.\n");
88   BgSetNumWorkThread(d/BgNumNodes());
89
90   fread(&d, sizeof(int), 1, f);
91   cva(bgMach).x = d;
92   fread(&d, sizeof(int), 1, f);
93   cva(bgMach).y = d;
94   fread(&d, sizeof(int), 1, f);
95   cva(bgMach).z = d;
96
97   //myNode->id = nodeInfo::XYZ2Local(myNode->x,myNode->y,myNode->z);
98
99   CmiPrintf("BgMessageReplay: PE => %d NumPes => %d wth:%d\n", BgGetGlobalWorkerThreadID(), BgNumNodes()*BgGetNumWorkThread(), BgGetNumWorkThread());
100
101   replay();
102 }
103
104 void BgRead_nodeinfo(int node, int &startpe, int &endpe)
105 {
106     char fName[128];
107     sprintf(fName,"bgnode_%06d.log",node);
108     FILE *fp = fopen(fName, "r");
109     if (fp==NULL) {
110       CmiPrintf("BgReplayNode> metadata file for node %d does not exist!\n", node);
111       CmiAbort("BgRead_nodeinfo");
112     }
113     fscanf(fp, "%d %d\n", &startpe, &endpe);
114     fclose(fp);
115 }
116