[project @ 2000-04-03 15:54:49 by simonmar]
[ghc-hetmet.git] / ghc / rts / RtsFlags.h
1 /* -----------------------------------------------------------------------------
2  * $Id: RtsFlags.h,v 1.24 2000/04/03 15:54:50 simonmar Exp $
3  *
4  * (c) The GHC Team, 1998-1999
5  *
6  * Datatypes that holds the command-line flag settings.
7  *
8  * ---------------------------------------------------------------------------*/
9
10 #ifndef RTSFLAGS_H
11 #define RTSFLAGS_H
12
13 /* For defaults, see the @initRtsFlagsDefaults@ routine. */
14
15 struct GC_FLAGS {
16     FILE   *statsFile;
17     nat     giveStats;
18 #define NO_GC_STATS      0
19 #define SUMMARY_GC_STATS 1
20 #define VERBOSE_GC_STATS 2
21
22     nat     maxStkSize;         /* in *words* */
23     nat     initialStkSize;     /* in *words* */
24
25     nat     maxHeapSize;        /* in *blocks* */
26     nat     minAllocAreaSize;   /* in *blocks* */
27     nat     minOldGenSize;      /* in *blocks* */
28     nat     heapSizeSuggestion; /* in *blocks* */
29     double  oldGenFactor;
30     double  pcFreeHeap;
31
32     nat     generations;
33     nat     steps;
34
35     rtsBool ringBell;
36
37     rtsBool squeezeUpdFrames;
38 };
39
40 /* Hack: this struct uses bitfields so that we can use a binary arg
41  * with the -D flag.
42  * Remember to update the corresponding bit of RtsFlags.c if you
43  * change/extend this struct.
44  */
45 struct DEBUG_FLAGS {  
46   /* flags to control debugging output in various subsystems */
47   rtsBool scheduler   : 1; /*  1 */
48   rtsBool evaluator   : 1; /*  2 */
49   rtsBool codegen     : 1; /*  4 */
50   rtsBool weak        : 1; /*  8 */
51   rtsBool gccafs      : 1; /* 16 */
52   rtsBool gc          : 1; /* 32 */
53   rtsBool block_alloc : 1; /* 64 */
54
55   /* flags to control consistency checking (often very expensive!) */
56   rtsBool sanity      : 1; /* 128 */
57
58   rtsBool stable      : 1; /* 256 */
59   rtsBool prof        : 1; /* 512 */
60   rtsBool gran        : 1; /* 1024 */
61   rtsBool par         : 1; /* 2048 */
62 };
63
64 #define MAX_DEBUG_OPTION     11
65 #define DEBUG_MASK(n)        ((nat)(ldexp(1,n)))
66 #define MAX_DEBUG_MASK       ((nat)(ldexp(1,(MAX_DEBUG_OPTION+1))-1))
67
68 #if defined(PROFILING) || defined(PAR)
69     /* with PROFILING, full cost-centre stuff (also PROFILING_FLAGS);
70        with PAR, just the four fixed cost-centres.
71     */
72 struct COST_CENTRE_FLAGS {
73     unsigned int            doCostCentres;
74 # define COST_CENTRES_SUMMARY   1
75 # define COST_CENTRES_VERBOSE   2 /* incl. serial time profile */
76 # define COST_CENTRES_ALL       3
77 # define COST_CENTRES_XML       4
78
79     int     ctxtSwitchTicks; /* derived */
80     int     profilerTicks;   /* derived */
81     int     msecsPerTick;    /* derived */
82 };
83 #endif
84
85 #ifdef PROFILING
86 struct PROFILING_FLAGS {
87     unsigned int        doHeapProfile;
88
89 # define NO_HEAP_PROFILING      0       /* N.B. Used as indexes into arrays */
90 # define HEAP_BY_CCS            1
91 # define HEAP_BY_MOD            2
92 # define HEAP_BY_DESCR          4
93 # define HEAP_BY_TYPE           5
94 # define HEAP_BY_TIME           6
95
96     rtsBool             showCCSOnException;
97   
98 # define CCchar    'C'
99 # define MODchar   'M'
100 # define DESCRchar 'D'
101 # define TYPEchar  'Y'
102 # define TIMEchar  'T'
103
104     char *ccSelector;
105     char *modSelector;
106     char *descrSelector;
107     char *typeSelector;
108     char *kindSelector;
109 };
110 #elif defined(DEBUG)
111 # define NO_HEAP_PROFILING      0
112 # define HEAP_BY_INFOPTR        1
113 # define HEAP_BY_CLOSURE_TYPE   2
114 struct PROFILING_FLAGS {
115     unsigned int      doHeapProfile; /* heap profile using symbol table */
116 };
117 #endif /* DEBUG || PROFILING */
118
119 struct CONCURRENT_FLAGS {
120   int ctxtSwitchTime; /* in milliseconds */
121 };
122
123 #ifdef PAR
124 /* currently the same as GRAN_STATS_FLAGS */
125 struct PAR_STATS_FLAGS {
126   rtsBool Full;       /* Full .gr profile (rtsTrue) or only END events? */
127   // rtsBool Suppressed; /* No .gr profile at all */
128   rtsBool Binary;     /* Binary profile? (not yet implemented) */
129   rtsBool Sparks;     /* Info on sparks in profile? */
130   rtsBool Heap;       /* Info on heap allocs in profile? */ 
131   rtsBool NewLogfile; /* Use new log-file format? (not yet implemented) */
132   rtsBool Global;     /* Global statistics? (printed on shutdown; no log file) */
133 };
134
135 struct PAR_DEBUG_FLAGS {  
136   /* flags to control debugging output in various subsystems */
137   rtsBool verbose    : 1; /*    1 */
138   rtsBool trace      : 1; /*    2 */
139   rtsBool schedule   : 1; /*    4 */
140   rtsBool free       : 1; /*    8 */
141   rtsBool resume     : 1; /*   16 */
142   rtsBool weight     : 1; /*   32 */
143   rtsBool fetch      : 1; /*   64 */
144   rtsBool fish       : 1; /*  128 */
145   rtsBool tables     : 1; /*  256 */
146   rtsBool packet     : 1; /*  512 */
147   rtsBool pack       : 1; /* 1024 */
148 };
149
150 #define MAX_PAR_DEBUG_OPTION     10
151 #define PAR_DEBUG_MASK(n)        ((nat)(ldexp(1,n)))
152 #define MAX_PAR_DEBUG_MASK       ((nat)(ldexp(1,(MAX_PAR_DEBUG_OPTION+1))-1))
153
154 struct PAR_FLAGS {
155   struct PAR_STATS_FLAGS ParStats;  /* profile and stats output */
156   struct PAR_DEBUG_FLAGS Debug;         /* debugging options */
157   rtsBool  outputDisabled;        /* Disable output for performance purposes */
158   nat      packBufferSize;
159   nat      maxLocalSparks;        /* spark pool size */
160   nat      maxThreads;            /* thread pool size */
161   nat      maxFishes;             /* max number of active fishes */
162   rtsTime  fishDelay;             /* delay before sending a new fish */
163   long   wait;
164 };
165 #endif /* PAR */
166
167 #ifdef SMP
168 struct PAR_FLAGS {
169   nat            nNodes;         /* number of threads to run simultaneously */
170   unsigned int   maxLocalSparks;
171 };
172 #endif /* SMP */
173
174 #ifdef GRAN
175 struct GRAN_STATS_FLAGS {
176   rtsBool Full;       /* Full .gr profile (rtsTrue) or only END events? */
177   rtsBool Suppressed; /* No .gr profile at all */
178   rtsBool Binary;     /* Binary profile? (not yet implemented) */
179   rtsBool Sparks;     /* Info on sparks in profile? */
180   rtsBool Heap;       /* Info on heap allocs in profile? */ 
181   rtsBool NewLogfile; /* Use new log-file format? (not yet implemented) */
182   rtsBool Global;     /* Global statistics? (printed on shutdown; no log file) */
183 };
184
185 struct GRAN_COST_FLAGS {
186   /* Communication Cost Variables -- set in main program */
187   nat latency;              /* Latency for single packet */
188   nat additional_latency;   /* Latency for additional packets */
189   nat fetchtime;            
190   nat lunblocktime;         /* Time for local unblock */
191   nat gunblocktime;         /* Time for global unblock */
192   nat mpacktime;            /* Cost of creating a packet */     
193   nat munpacktime;          /* Cost of receiving a packet */    
194   nat mtidytime;            /* Cost of cleaning up after send */
195   
196   nat threadcreatetime;     /* Thread creation costs */
197   nat threadqueuetime;      /* Cost of adding a thread to the running/runnable queue */
198   nat threaddescheduletime; /* Cost of descheduling a thread */
199   nat threadscheduletime;   /* Cost of scheduling a thread */
200   nat threadcontextswitchtime;  /* Cost of context switch  */
201   
202   /* Instruction Costs */
203   nat arith_cost;        /* arithmetic instructions (+,i,< etc) */
204   nat branch_cost;       /* branch instructions */ 
205   nat load_cost;         /* load into register */
206   nat store_cost;        /* store into memory */
207   nat float_cost;        /* floating point operations */
208   
209   nat heapalloc_cost;    /* heap allocation costs */
210   
211   /* Overhead for granularity control mechanisms */
212   /* overhead per elem of spark queue */
213   nat pri_spark_overhead;
214   /* overhead per elem of thread queue */
215   nat pri_sched_overhead;
216 };
217
218 struct GRAN_DEBUG_FLAGS {  
219   /* flags to control debugging output in various subsystems */
220   rtsBool event_trace    : 1; /*    1 */
221   rtsBool event_stats    : 1; /*    2 */
222   rtsBool bq             : 1; /*    4 */
223   rtsBool pack           : 1; /*    8 */
224   rtsBool checkSparkQ    : 1; /*   16 */
225   rtsBool thunkStealing  : 1; /*   32 */
226   rtsBool randomSteal    : 1; /*   64 */
227   rtsBool findWork       : 1; /*  128 */
228   rtsBool unused         : 1; /*  256 */
229   rtsBool pri            : 1; /*  512 */
230   rtsBool checkLight     : 1; /* 1024 */
231   rtsBool sortedQ        : 1; /* 2048 */
232   rtsBool blockOnFetch   : 1; /* 4096 */
233   rtsBool packBuffer     : 1; /* 8192 */
234   rtsBool blockOnFetch_sanity : 1; /*  16384 */
235 };
236
237 #define MAX_GRAN_DEBUG_OPTION     14
238 #define GRAN_DEBUG_MASK(n)        ((nat)(ldexp(1,n)))
239 #define MAX_GRAN_DEBUG_MASK       ((nat)(ldexp(1,(MAX_GRAN_DEBUG_OPTION+1))-1))
240
241 struct GRAN_FLAGS {
242   struct GRAN_STATS_FLAGS GranSimStats;  /* profile and stats output */
243   struct GRAN_COST_FLAGS Costs;          /* cost metric for simulation */
244   struct GRAN_DEBUG_FLAGS Debug;         /* debugging options */
245
246   nat  maxThreads;              // ToDo: share with SMP and GUM
247   // rtsBool labelling;
248   nat  packBufferSize;
249   nat  packBufferSize_internal;
250
251   PEs proc;                     /* number of processors */
252   rtsBool Fishing;              /* Simulate GUM style fishing mechanism? */
253   nat maxFishes;                /* max number of spark or thread steals */
254   rtsTime time_slice;           /* max time slice of one reduction thread */
255
256     /* GrAnSim-Light: This version puts no bound on the number of
257          processors but in exchange doesn't model communication costs
258          (all communication is 0 cost). Mainly intended to show maximal
259          degree of parallelism in the program (*not* to simulate the
260          execution on a real machine). */
261    
262     rtsBool Light;
263
264     rtsBool DoFairSchedule ;        /* fair scheduling alg? default: unfair */
265     rtsBool DoAsyncFetch;           /* async. communication? */
266     rtsBool DoStealThreadsFirst;    /* prefer threads over sparks when stealing */
267   rtsBool DoAlwaysCreateThreads;  /* eager thread creation */
268   rtsBool DoBulkFetching;         /* bulk fetching */
269   rtsBool DoThreadMigration;      /* allow to move threads */
270   nat     FetchStrategy;         /* what to do when waiting for data */
271   rtsBool PreferSparksOfLocalNodes; /* prefer local over global sparks */
272   rtsBool DoPrioritySparking;     /* sparks sorted by priorities */
273   rtsBool DoPriorityScheduling;   /* threads sorted by priorities */
274   nat     SparkPriority;         /* threshold for cut-off mechanism */
275   nat     SparkPriority2;
276   rtsBool RandomPriorities;
277   rtsBool InversePriorities;
278   rtsBool IgnorePriorities;
279   nat     ThunksToPack;      /* number of thunks in packet + 1 */ 
280   rtsBool RandomSteal;        /* steal spark/thread from random proc */
281   rtsBool NoForward;        /* no forwarding of fetch messages */
282
283   // unsigned int           debug;
284   //  rtsBool event_trace;
285   //  rtsBool event_trace_all;
286 };
287 #endif /* GRAN */
288
289 #ifdef TICKY_TICKY
290 struct TICKY_FLAGS {
291     rtsBool showTickyStats;
292     FILE   *tickyFile;
293 };
294 #endif /* TICKY_TICKY */
295
296
297 /* Put them together: */
298
299 struct RTS_FLAGS {
300     struct GC_FLAGS     GcFlags;
301     struct DEBUG_FLAGS  DebugFlags;
302     struct CONCURRENT_FLAGS ConcFlags;
303
304 #if defined(PROFILING) || defined(PAR)
305     struct COST_CENTRE_FLAGS CcFlags;
306 #endif
307 #if defined(PROFILING) || defined(DEBUG)
308     struct PROFILING_FLAGS ProfFlags;
309 #endif
310 #if defined(SMP) || defined(PAR)
311     struct PAR_FLAGS    ParFlags;
312 #endif
313 #ifdef GRAN
314     struct GRAN_FLAGS   GranFlags;
315 #endif
316 #ifdef TICKY_TICKY
317     struct TICKY_FLAGS  TickyFlags;
318 #endif
319 };
320
321 #ifdef COMPILING_RTS_MAIN
322 extern DLLIMPORT struct RTS_FLAGS RtsFlags;
323 #else
324 extern struct RTS_FLAGS RtsFlags;
325 #endif
326
327 /* Routines that operate-on/to-do-with RTS flags: */
328
329 void initRtsFlagsDefaults(void);
330 void setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]);
331
332 /*
333  * The printf formats are here, so we are less likely to make
334  * overly-long filenames (with disastrous results).  No more than 128
335  * chars, please!  
336  */
337
338 #define STATS_FILENAME_MAXLEN   128
339
340 #define GR_FILENAME_FMT         "%0.124s.gr"
341 #define GR_FILENAME_FMT_GUM     "%0.120s.%03d.%s"
342 #define HP_FILENAME_FMT         "%0.124s.hp"
343 #define LIFE_FILENAME_FMT       "%0.122s.life"
344 #define PROF_FILENAME_FMT       "%0.122s.prof"
345 #define PROF_FILENAME_FMT_GUM   "%0.118s.%03d.prof"
346 #define QP_FILENAME_FMT         "%0.124s.qp"
347 #define STAT_FILENAME_FMT       "%0.122s.stat"
348 #define TICKY_FILENAME_FMT      "%0.121s.ticky"
349 #define TIME_FILENAME_FMT       "%0.122s.time"
350 #define TIME_FILENAME_FMT_GUM   "%0.118s.%03d.time"
351
352 /* an "int" so as to match normal "argc" */
353 /* Now defined in Stg.h (lib/std/cbits need these too.)
354 extern int     prog_argc;
355 extern char  **prog_argv;
356 */
357 extern int     rts_argc;  /* ditto */
358 extern char   *rts_argv[];
359
360 #endif  /* RTSFLAGS_H */