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