summaryrefslogtreecommitdiff
path: root/ghc/rts/RtsFlags.h
blob: 12588dce6267357273fa4cb0a660deaa97dfcab9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/* -----------------------------------------------------------------------------
 * $Id: RtsFlags.h,v 1.9 1999/02/05 16:02:50 simonm Exp $
 *
 * (c) The GHC Team, 1998-1999
 *
 * Datatypes that holds the command-line flag settings.
 *
 * ---------------------------------------------------------------------------*/

#ifndef RTSFLAGS_H
#define RTSFLAGS_H

/* For defaults, see the @initRtsFlagsDefaults@ routine. */

struct GC_FLAGS {
    FILE   *statsFile;
    nat	    giveStats; /* ToDo: replace with enum type? */
#define NO_GC_STATS	 0
#define VERBOSE_GC_STATS 1

    nat     maxStkSize;         /* in *words* */
    nat     initialStkSize;     /* in *words* */

    nat	    maxHeapSize;        /* in *blocks* */
    nat     minAllocAreaSize;   /* in *blocks* */
    nat     minOldGenSize;      /* in *blocks* */
    nat     heapSizeSuggestion; /* in *blocks* */
    double  oldGenFactor;
    double  pcFreeHeap;

    nat     generations;
    nat     steps;

    rtsBool forceGC; /* force a major GC every <interval> bytes */
    int	    forcingInterval; /* actually, stored as a number of *words* */
    rtsBool ringBell;

    rtsBool squeezeUpdFrames;
};

/* Hack: this struct uses bitfields so that we can use a binary arg
 * with the -D flag
 */
struct DEBUG_FLAGS {  
  /* flags to control debugging output in various subsystems */
  rtsBool scheduler   : 1; /*  1 */
  rtsBool evaluator   : 1; /*  2 */
  rtsBool codegen     : 1; /*  4 */
  rtsBool weak        : 1; /*  8 */
  rtsBool gccafs      : 1; /* 16 */
  rtsBool gc          : 1; /* 32 */
  rtsBool block_alloc : 1; /* 64 */

  /* flags to control consistency checking (often very expensive!) */
  rtsBool sanity      : 1; /* 128 */

  rtsBool stable      : 1; /* 256 */
};

#if defined(PROFILING) || defined(PAR)
    /* with PROFILING, full cost-centre stuff (also PROFILING_FLAGS);
       with PAR, just the four fixed cost-centres.
    */
struct COST_CENTRE_FLAGS {
    unsigned int	    doCostCentres;
# define COST_CENTRES_SUMMARY	1
# define COST_CENTRES_VERBOSE	2 /* incl. serial time profile */
# define COST_CENTRES_ALL	3

    char    sortBy;
# define SORTCC_LABEL	'C'
# define SORTCC_TIME 	'T'
# define SORTCC_ALLOC	'A'

    int	    ctxtSwitchTicks; /* derived */
    int	    profilerTicks;   /* derived */
    int	    msecsPerTick;    /* derived */
};
#endif

#ifdef PROFILING
struct PROFILING_FLAGS {
    unsigned int	doHeapProfile;
# define NO_HEAP_PROFILING	0	/* N.B. Used as indexes into arrays */
# define HEAP_BY_CC		1
# define HEAP_BY_MOD		2
# define HEAP_BY_GRP		3
# define HEAP_BY_DESCR		4
# define HEAP_BY_TYPE		5
# define HEAP_BY_TIME		6
  
# define CCchar    'C'
# define MODchar   'M'
# define GRPchar   'G'
# define DESCRchar 'D'
# define TYPEchar  'Y'
# define TIMEchar  'T'

    char *ccSelector;
    char *modSelector;
    char *grpSelector;
    char *descrSelector;
    char *typeSelector;
    char *kindSelector;
};
#elif defined(DEBUG)
# define NO_HEAP_PROFILING	0
# define HEAP_BY_INFOPTR        1
# define HEAP_BY_CLOSURE_TYPE   2
struct PROFILING_FLAGS {
    unsigned int      doHeapProfile; /* heap profile using symbol table */
};
#endif /* DEBUG || PROFILING */

struct CONCURRENT_FLAGS {
    int	    ctxtSwitchTime; /* in milliseconds */
    int	    maxThreads;
};

#ifdef PAR
struct PAR_FLAGS {
    rtsBool parallelStats; 	/* Gather parallel statistics */
    rtsBool granSimStats;	/* Full .gr profile (rtsTrue) or only END events? */
    rtsBool granSimStats_Binary;

    rtsBool outputDisabled;	/* Disable output for performance purposes */
    
    unsigned int	    packBufferSize;
    unsigned int	    maxLocalSparks;
};

#endif /* PAR */

#ifdef GRAN
struct GRAN_FLAGS {
    rtsBool granSimStats;  /* Full .gr profile (rtsTrue) or only END events? */
    rtsBool granSimStats_suppressed; /* No .gr profile at all */
    rtsBool granSimStats_Binary;
    rtsBool granSimStats_Sparks;
    rtsBool granSimStats_Heap;
    rtsBool labelling;
    unsigned int	    packBufferSize;
    unsigned int	    packBufferSize_internal;

    int proc;                      /* number of processors */
    int max_fishes;                /* max number of spark or thread steals */
    TIME time_slice;              /* max time slice of one reduction thread */

    /* Communication Cost Variables -- set in main program */
    unsigned int gran_latency;              /* Latency for single packet */
    unsigned int gran_additional_latency;   /* Latency for additional packets */
    unsigned int gran_fetchtime;            
    unsigned int gran_lunblocktime;         /* Time for local unblock */
    unsigned int gran_gunblocktime;         /* Time for global unblock */
    unsigned int gran_mpacktime;            /* Cost of creating a packet */     
    unsigned int gran_munpacktime;	  /* Cost of receiving a packet */    
    unsigned int gran_mtidytime;		  /* Cost of cleaning up after send */

    unsigned int gran_threadcreatetime;     /* Thread creation costs */
    unsigned int gran_threadqueuetime;      /* Cost of adding a thread to the running/runnable queue */
    unsigned int gran_threaddescheduletime; /* Cost of descheduling a thread */
    unsigned int gran_threadscheduletime;   /* Cost of scheduling a thread */
    unsigned int gran_threadcontextswitchtime;  /* Cost of context switch  */

    /* Instruction Costs */
    unsigned int gran_arith_cost;        /* arithmetic instructions (+,i,< etc) */
    unsigned int gran_branch_cost;       /* branch instructions */ 
    unsigned int gran_load_cost;         /* load into register */
    unsigned int gran_store_cost;        /* store into memory */
    unsigned int gran_float_cost;        /* floating point operations */

    unsigned int gran_heapalloc_cost;    /* heap allocation costs */

    /* Overhead for granularity control mechanisms */
    /* overhead per elem of spark queue */
    unsigned int gran_pri_spark_overhead;
    /* overhead per elem of thread queue */
    unsigned int gran_pri_sched_overhead;

    /* GrAnSim-Light: This version puts no bound on the number of
         processors but in exchange doesn't model communication costs
         (all communication is 0 cost). Mainly intended to show maximal
         degree of parallelism in the program (*not* to simulate the
         execution on a real machine). */
   
    rtsBool Light;

    rtsBool DoFairSchedule ;        /* fair scheduling alg? default: unfair */
    rtsBool DoReScheduleOnFetch ;   /* async. communication? */
    rtsBool DoStealThreadsFirst;    /* prefer threads over sparks when stealing */
    rtsBool SimplifiedFetch;        /* fast but inaccurate fetch modelling */
    rtsBool DoAlwaysCreateThreads;  /* eager thread creation */
    rtsBool DoGUMMFetching;         /* bulk fetching */
    rtsBool DoThreadMigration;      /* allow to move threads */
    int      FetchStrategy;          /* what to do when waiting for data */
    rtsBool PreferSparksOfLocalNodes; /* prefer local over global sparks */
    rtsBool DoPrioritySparking;     /* sparks sorted by priorities */
    rtsBool DoPriorityScheduling;   /* threads sorted by priorities */
    int      SparkPriority;          /* threshold for cut-off mechanism */
    int      SparkPriority2;
    rtsBool RandomPriorities;
    rtsBool InversePriorities;
    rtsBool IgnorePriorities;
    int      ThunksToPack;           /* number of thunks in packet + 1 */ 
    rtsBool RandomSteal;            /* steal spark/thread from random proc */
    rtsBool NoForward;              /* no forwarding of fetch messages */
    rtsBool PrintFetchMisses;       /* print number of fetch misses */

    unsigned int	    debug;
    rtsBool event_trace;
    rtsBool event_trace_all;
   
};
#endif /* GRAN */

#ifdef TICKY_TICKY
struct TICKY_FLAGS {
    rtsBool showTickyStats;
    FILE   *tickyFile;

    /* see also: doUpdEntryCounts in AllFlags */
};
#endif /* TICKY_TICKY */


/* Put them together: */

struct RTS_FLAGS {
    struct GC_FLAGS	GcFlags;
    struct DEBUG_FLAGS	DebugFlags;
    struct CONCURRENT_FLAGS ConcFlags;

#if defined(PROFILING) || defined(PAR)
    struct COST_CENTRE_FLAGS CcFlags;
#endif
#if defined(PROFILING) || defined(DEBUG)
    struct PROFILING_FLAGS ProfFlags;
#endif
#ifdef PAR
    struct PAR_FLAGS	ParFlags;
#endif
#ifdef GRAN
    struct GRAN_FLAGS	GranFlags;
#endif
#ifdef TICKY_TICKY
    struct TICKY_FLAGS	TickyFlags;
#endif
};

extern struct RTS_FLAGS RtsFlags;

/* Routines that operate-on/to-do-with RTS flags: */

void initRtsFlagsDefaults(void);
void setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]);

/*
 * The printf formats are here, so we are less likely to make
 * overly-long filenames (with disastrous results).  No more than 128
 * chars, please!  
 */

#define STATS_FILENAME_MAXLEN	128

#define GR_FILENAME_FMT		"%0.124s.gr"
#define GR_FILENAME_FMT_GUM	"%0.120s.%03d.%s"
#define HP_FILENAME_FMT		"%0.124s.hp"
#define LIFE_FILENAME_FMT	"%0.122s.life"
#define PROF_FILENAME_FMT	"%0.122s.prof"
#define PROF_FILENAME_FMT_GUM	"%0.118s.%03d.prof"
#define QP_FILENAME_FMT		"%0.124s.qp"
#define STAT_FILENAME_FMT	"%0.122s.stat"
#define TICKY_FILENAME_FMT	"%0.121s.ticky"
#define TIME_FILENAME_FMT	"%0.122s.time"
#define TIME_FILENAME_FMT_GUM	"%0.118s.%03d.time"

extern int     prog_argc; /* an "int" so as to match normal "argc" */
extern char  **prog_argv;
extern int     rts_argc;  /* ditto */
extern char   *rts_argv[];

#endif	/* RTSFLAGS_H */