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