fixed a typo
[charm.git] / src / langs / bluegene / bigsim_init.C
1 /** \file: bigsim_init.C -- Converse BlueGene Emulator Code
2  *  Emulator written by Gengbin Zheng, gzheng@uiuc.edu on 5/16/2003
3  */
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdlib.h>
8
9 #include <fstream>
10 #include <iostream>
11 using namespace std;
12
13 #include "bigsim_debug.h"
14 #undef DEBUGLEVEL
15 #define DEBUGLEVEL 10 
16 //#define  DEBUGF(x)      //CmiPrintf x;
17
18 #include "queueing.h"
19 #include "blue.h"
20 #include "blue_impl.h"          // implementation header file
21 //#include "blue_timing.h"      // timing module
22
23 #include "bigsim_ooc.h"
24
25 extern CmiStartFn bgMain(int argc, char **argv);
26
27 /* called by a AMPI thread of certan rank to attatch itself */
28 extern "C" void BgAttach(CthThread t)
29 {
30 //  CthShadow(t, cta(threadinfo)->getThread());
31   CtvAccessOther(t, threadinfo)= cta(threadinfo);
32     // special thread scheduling
33   BgSetStrategyBigSimDefault(t);
34     // set serial number
35   CthSetSerialNo(t, CtvAccessOther(t, threadinfo)->cth_serialNo++);
36 }
37
38 extern "C" void BgSetStartOutOfCore(){
39     DEBUGM(4, ("Set startOutOfCore!(node: %d, gId: %d, id: %d)\n", tMYNODEID, tMYGLOBALID, tMYID));
40     if(cta(threadinfo)->startOutOfCore==0)
41         cta(threadinfo)->startOOCChanged=1;
42     cta(threadinfo)->startOutOfCore = 1;
43 }
44
45 extern "C" void BgUnsetStartOutOfCore(){
46     DEBUGM(4, ("UnSet startOutOfCore!(node: %d, gId: %d, id: %d)\n", tMYNODEID, tMYGLOBALID, tMYID));
47     if(cta(threadinfo)->startOutOfCore==1)
48         cta(threadinfo)->startOOCChanged=1;
49     cta(threadinfo)->startOutOfCore = 0;
50 }
51
52 // quiescence detection callback
53 // only used when doing timing correction to wait for 
54 static void BroadcastShutdown(void *null, double t)
55 {
56   /* broadcast to shutdown */
57   CmiPrintf("BG> In BroadcastShutdown after quiescence. \n");
58
59   int msgSize = CmiBlueGeneMsgHeaderSizeBytes;
60   void *sendmsg = CmiAlloc(msgSize);
61   CmiSetHandler(sendmsg, cva(simState).exitHandler);
62   CmiSyncBroadcastAllAndFree(msgSize, sendmsg);
63
64   CmiDeliverMsgs(-1);
65   CmiPrintf("\nBG> BigSim emulator shutdown gracefully!\n");
66   CmiPrintf("BG> Emulation took %f seconds!\n", CmiWallTimer()-cva(simState).simStartTime);
67   CsdExitScheduler();
68 /*
69   ConverseExit();
70   exit(0);
71 */
72 }
73
74 void BgShutdown()
75 {
76   /* when doing timing correction, do a converse quiescence detection
77      to wait for all timing correction messages
78   */
79
80   if (!correctTimeLog) {
81     /* broadcast to shutdown */
82     int msgSize = CmiBlueGeneMsgHeaderSizeBytes;
83     void *sendmsg = CmiAlloc(msgSize);
84     
85     CmiSetHandler(sendmsg, cva(simState).exitHandler);
86     CmiSyncBroadcastAllAndFree(msgSize, sendmsg);
87     
88     //CmiAbort("\nBG> BlueGene emulator shutdown gracefully!\n");
89     // CmiPrintf("\nBG> BlueGene emulator shutdown gracefully!\n");
90     /* don't return */
91     // ConverseExit();
92     CmiDeliverMsgs(-1);
93
94     if(bgUseOutOfCore)
95         deInitTblThreadInMem();
96
97     CmiPrintf("\nBG> BigSim emulator shutdown gracefully!\n");
98     CmiPrintf("BG> Emulation took %f seconds!\n", CmiWallTimer()-cva(simState).simStartTime);
99     ConverseExit();
100     exit(0);
101   }
102   else {
103   
104     int msgSize = CmiBlueGeneMsgHeaderSizeBytes;
105     void *sendmsg = CmiAlloc(msgSize); 
106 CmiPrintf("\n\n\nBroadcast begin EXIT\n");
107     CmiSetHandler(sendmsg, cva(simState).beginExitHandler);
108     CmiSyncBroadcastAllAndFree(msgSize, sendmsg);
109
110     CmiStartQD(BroadcastShutdown, NULL);
111
112 #if 0
113     // trapped here, so close the log
114     BG_ENTRYEND();
115     stopVTimer();
116     // hack to remove the pending message for this work thread
117     tAFFINITYQ.deq();
118
119     CmiDeliverMsgs(-1);
120     ConverseExit();
121 #endif
122   }
123 }
124
125 int BGMach::traceProjections(int pe)
126 {
127   if (procList.isEmpty()) return 1;
128   return procList.includes(pe);
129 }
130
131 void BGMach::setNetworkModel(char *model)
132 {
133   if (!strcmp(model, "dummy"))
134     network = new DummyNetwork;
135   else if (!strcmp(model, "lemieux"))
136     network = new LemieuxNetwork;
137   else if (!strcmp(model, "bluegenep")) {
138     network = new BlueGenePNetwork;
139     network->setDimensions(x, y, z, numWth);
140   } else if (!strcmp(model, "bluegene"))
141         network = new BlueGeneNetwork;
142   else if (!strcmp(model, "redstorm"))
143         network = new RedStormNetwork;
144   else if (!strcmp(model, "ibmpower"))
145         network = new IBMPowerNetwork;
146   else
147         CmiAbort("BG> unknown network setup");
148 }
149
150 int BGMach::read(char *file)
151 {
152   ifstream configFile(file);
153   if (configFile.fail()) {
154     cout << "Bad config file, trouble opening\n";
155     exit(1);
156   }
157
158   char parameterName  [1024];
159   char parameterValue [1024];
160                                                                                 
161   if (CmiMyPe() == 0)
162   CmiPrintf("Reading Bluegene Config file %s ...\n", file);
163                                                                                 
164   while (true) {
165     configFile >> parameterName >> parameterValue;
166     if (configFile.eof())
167       break;
168                                                                                 
169     // CmiPrintf("%s %s\n", parameterName, parameterValue);
170
171     if (!strcmp(parameterName, "x")) {
172       x = atoi(parameterValue);
173       continue;
174     }
175     if (!strcmp(parameterName, "y")) {
176       y = atoi(parameterValue);
177       continue;
178     }
179     if (!strcmp(parameterName, "z")) {
180       z = atoi(parameterValue);
181       continue;
182     }
183     if (!strcmp(parameterName, "cth")) {
184       numCth = atoi(parameterValue);
185       continue;
186     }
187     if (!strcmp(parameterName, "wth")) {
188       numWth = atoi(parameterValue);
189       continue;
190     }
191     if (!strcmp(parameterName, "stacksize")) {
192       stacksize = atoi(parameterValue);
193       continue;
194     }
195     if (!strcmp(parameterName, "timing")) {
196       if (!strcmp(parameterValue, "elapse"))
197         timingMethod = BG_ELAPSE;
198       else if (!strcmp(parameterValue, "walltime"))
199         timingMethod = BG_WALLTIME;
200       else if (!strcmp(parameterValue, "counter"))
201         timingMethod = BG_COUNTER;
202       else CmiAbort("BG> unknown timing method");
203       continue;
204     }
205     if (!strcmp(parameterName, "cpufactor")) {
206       cpufactor = atof(parameterValue);
207       continue;
208     }
209     if (!strcmp(parameterName, "fpfactor")) {
210       fpfactor = atof(parameterValue);
211       continue;
212     }
213     if (!strcmp(parameterName, "log")) {
214       if (!strcmp(parameterValue, "yes"))
215         genTimeLog = 1;
216       continue;
217     }
218     if (!strcmp(parameterName, "correct")) {
219       if (!strcmp(parameterValue, "yes"))
220         correctTimeLog = 1;
221       continue;
222     }
223     if (!strcmp(parameterName, "traceroot")) {
224       traceroot = (char *)malloc(strlen(parameterValue)+4);
225       sprintf(traceroot, "%s/", parameterValue);
226       continue;
227     }
228     if (!strcmp(parameterName, "network")) {
229       setNetworkModel(parameterValue);
230       continue;
231     }
232     if (!strcmp(parameterName, "projections")) {
233       procList.set(strdup(parameterValue));
234       continue;
235     }
236     if (!strcmp(parameterName, "record")) {
237       if (!strcmp(parameterValue, "yes"))
238         record = 1;
239       continue;
240     }
241     if (!strcmp(parameterName, "recordprocessors")) {
242       recordprocs.set(strdup(parameterValue));
243       continue;
244     }
245     /* Parameters related with out-of-core execution */
246 //    if (!strcmp(parameterName, "bgooc")) {      
247 //        bgUseOutOfCore = 1;
248 //        bgOOCMaxMemSize = atof(parameterValue);
249 //        continue;
250 //    }           
251     if (!strcmp(parameterName, "timercost")) {
252       timercost = atof(parameterValue);
253       continue;
254     }
255
256     if (CmiMyPe() == 0)
257       CmiPrintf("skip %s '%s'\n", parameterName, parameterValue);
258   }
259
260   configFile.close();
261   return 0;
262 }
263
264 int main(int argc,char *argv[])
265 {
266   ConverseInit(argc,argv,(CmiStartFn)bgMain,0,0);
267   return 0;
268 }
269
270
271