- /* The following class of options contains eXperimental */
- /* features in connection with exploiting granularity */
- /* information. I.e. if -bY is chosen these options */
- /* tell the RTS what to do with the supplied info --HWL */
-
- case 'W':
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.GranFlags.packBufferSize_internal = decode(rts_argv[arg]+3);
- } else {
- RtsFlags.GranFlags.packBufferSize_internal = GRANSIM_DEFAULT_PACK_BUFFER_SIZE;
- }
- debugBelch("Size of GranSim internal pack buffer: %u.\n",
- RtsFlags.GranFlags.packBufferSize_internal);
- break;
-
- case 'X':
- switch(rts_argv[arg][3]) {
-
- case '\0':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with Normal Priorities.\n");
- RtsFlags.GranFlags.InversePriorities = rtsFalse;
- RtsFlags.GranFlags.RandomPriorities = rtsFalse;
- RtsFlags.GranFlags.IgnorePriorities = rtsFalse;
- break;
-
- case 'I':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with Inverse Priorities.\n");
- RtsFlags.GranFlags.InversePriorities++;
- break;
-
- case 'R':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with Random Priorities.\n");
- RtsFlags.GranFlags.RandomPriorities++;
- break;
-
- case 'N':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with No Priorities.\n");
- RtsFlags.GranFlags.IgnorePriorities++;
- break;
-
- default:
- bad_option( rts_argv[arg] );
- break;
- }
- break;
-
- case '-':
- switch(rts_argv[arg][3]) {
-
- case 'C':
- RtsFlags.GranFlags.DoAlwaysCreateThreads=rtsFalse;
- RtsFlags.GranFlags.DoThreadMigration=rtsFalse;
- break;
-
- case 'G':
- RtsFlags.GranFlags.DoBulkFetching=rtsFalse;
- break;
-
- case 'M':
- RtsFlags.GranFlags.DoThreadMigration=rtsFalse;
- break;
-
- case 'R':
- RtsFlags.GranFlags.DoFairSchedule=rtsFalse;
- break;
-
- case 'T':
- RtsFlags.GranFlags.DoStealThreadsFirst=rtsFalse;
- RtsFlags.GranFlags.DoThreadMigration=rtsFalse;
- break;
-
- case 'Z':
- RtsFlags.GranFlags.DoAsyncFetch=rtsFalse;
- break;
-
- case 'N':
- RtsFlags.GranFlags.PreferSparksOfLocalNodes=rtsFalse;
- break;
-
- case 'P':
- RtsFlags.GranFlags.GranSimStats.Suppressed=rtsTrue;
- break;
-
- case 's':
- RtsFlags.GranFlags.GranSimStats.Sparks=rtsFalse;
- break;
-
- case 'h':
- RtsFlags.GranFlags.GranSimStats.Heap=rtsFalse;
- break;
-
- case 'b':
- RtsFlags.GranFlags.GranSimStats.Binary=rtsFalse;
- break;
-
- case 'X':
- RtsFlags.GranFlags.DoPrioritySparking = rtsFalse;
- break;
-
- case 'Y':
- RtsFlags.GranFlags.DoPrioritySparking = rtsFalse;
- RtsFlags.GranFlags.SparkPriority = rtsFalse;
- break;
-
- case 'I':
- RtsFlags.GranFlags.DoPriorityScheduling = rtsFalse;
- break;
-
- case 'e':
- RtsFlags.GranFlags.RandomSteal = rtsFalse;
- break;
-
- default:
- bad_option( rts_argv[arg] );
- break;
- }
- break;
-
-# if defined(GRAN_CHECK) && defined(GRAN)
- case 'D':
- switch(rts_argv[arg][3]) {
- case 'Q': /* Set pack buffer size (same as 'Q' in GUM) */
- if (rts_argv[arg][4] != '\0') {
- RtsFlags.GranFlags.packBufferSize = decode(rts_argv[arg]+4);
- debugBelch("Pack buffer size: %d\n",
- RtsFlags.GranFlags.packBufferSize);
- } else {
- debugBelch("setupRtsFlags: missing size of PackBuffer (for -Q)\n");
- *error = rtsTrue;
- }
- break;
-
- default:
- if (isdigit(rts_argv[arg][3])) {/* Set all debugging options in one */
- /* hack warning: interpret the flags as a binary number */
- nat n = decode(rts_argv[arg]+3);
- set_GranSim_debug_options(n);
- } else {
- nat i;
- for (i=0; i<=MAX_GRAN_DEBUG_OPTION; i++)
- if (rts_argv[arg][3] == gran_debug_opts_flags[i])
- break;
-
- if (i==MAX_GRAN_DEBUG_OPTION+1) {
- debugBelch("Valid GranSim debug options are:\n");
- help_GranSim_debug_options(MAX_GRAN_DEBUG_MASK);
- bad_option( rts_argv[arg] );
- } else { // flag found; now set it
- set_GranSim_debug_options(GRAN_DEBUG_MASK(i)); // 2^i
- }
- }
- break;
-
-#if 0
- case 'e': /* event trace; also -bD1 */
- debugBelch("DEBUG: event_trace; printing event trace.\n");
- RtsFlags.GranFlags.Debug.event_trace = rtsTrue;
- /* RtsFlags.GranFlags.event_trace=rtsTrue; */
- break;
-
- case 'E': /* event statistics; also -bD2 */
- debugBelch("DEBUG: event_stats; printing event statistics.\n");
- RtsFlags.GranFlags.Debug.event_stats = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x20; print event statistics */
- break;
-
- case 'f': /* thunkStealing; also -bD4 */
- debugBelch("DEBUG: thunkStealing; printing forwarding of FETCHNODES.\n");
- RtsFlags.GranFlags.Debug.thunkStealing = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x2; print fwd messages */
- break;
-
- case 'z': /* blockOnFetch; also -bD8 */
- debugBelch("DEBUG: blockOnFetch; check for blocked on fetch.\n");
- RtsFlags.GranFlags.Debug.blockOnFetch = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x4; debug non-reschedule-on-fetch */
- break;
-
- case 't': /* blockOnFetch_sanity; also -bD16 */
- debugBelch("DEBUG: blockOnFetch_sanity; check for TSO asleep on fetch.\n");
- RtsFlags.GranFlags.Debug.blockOnFetch_sanity = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x10; debug TSO asleep for fetch */
- break;
-
- case 'S': /* priSpark; also -bD32 */
- debugBelch("DEBUG: priSpark; priority sparking.\n");
- RtsFlags.GranFlags.Debug.priSpark = rtsTrue;
- break;
-
- case 's': /* priSched; also -bD64 */
- debugBelch("DEBUG: priSched; priority scheduling.\n");
- RtsFlags.GranFlags.Debug.priSched = rtsTrue;
- break;
-
- case 'F': /* findWork; also -bD128 */
- debugBelch("DEBUG: findWork; searching spark-pools (local & remote), thread queues for work.\n");
- RtsFlags.GranFlags.Debug.findWork = rtsTrue;
- break;
-
- case 'g': /* globalBlock; also -bD256 */
- debugBelch("DEBUG: globalBlock; blocking on remote closures (FETCHMEs etc in GUM).\n");
- RtsFlags.GranFlags.Debug.globalBlock = rtsTrue;
- break;
-
- case 'G': /* pack; also -bD512 */
- debugBelch("DEBUG: pack; routines for (un-)packing graph structures.\n");
- RtsFlags.GranFlags.Debug.pack = rtsTrue;
- break;
-
- case 'P': /* packBuffer; also -bD1024 */
- debugBelch("DEBUG: packBuffer; routines handling pack buffer (GranSim internal!).\n");
- RtsFlags.GranFlags.Debug.packBuffer = rtsTrue;
- break;
-
- case 'o': /* sortedQ; also -bD2048 */
- debugBelch("DEBUG: sortedQ; check whether spark/thread queues are sorted.\n");
- RtsFlags.GranFlags.Debug.sortedQ = rtsTrue;
- break;
-
- case 'r': /* randomSteal; also -bD4096 */
- debugBelch("DEBUG: randomSteal; stealing sparks/threads from random PEs.\n");
- RtsFlags.GranFlags.Debug.randomSteal = rtsTrue;
- break;
-
- case 'q': /* checkSparkQ; also -bD8192 */
- debugBelch("DEBUG: checkSparkQ; check consistency of the spark queues.\n");
- RtsFlags.GranFlags.Debug.checkSparkQ = rtsTrue;
- break;
-
- case ':': /* checkLight; also -bD16384 */
- debugBelch("DEBUG: checkLight; check GranSim-Light setup.\n");
- RtsFlags.GranFlags.Debug.checkLight = rtsTrue;
- break;
-
- case 'b': /* bq; also -bD32768 */
- debugBelch("DEBUG: bq; check blocking queues\n");
- RtsFlags.GranFlags.Debug.bq = rtsTrue;
- break;
-
- case 'd': /* all options turned on */
- debugBelch("DEBUG: all options turned on.\n");
- set_GranSim_debug_options(MAX_GRAN_DEBUG_MASK);
- /* RtsFlags.GranFlags.Debug |= 0x40; */
- break;
-
-/* case '\0': */
-/* RtsFlags.GranFlags.Debug = 1; */
-/* break; */
-#endif
-
- }
- break;
-# endif /* GRAN_CHECK */
- default:
- bad_option( rts_argv[arg] );
- break;
- }
-}
-
-/*
- Interpret n as a binary number masking GranSim debug options and set the
- correxponding option. See gran_debug_opts_strs for explanations of the flags.
-*/
-static void
-set_GranSim_debug_options(nat n) {
- nat i;
-
- for (i=0; i<=MAX_GRAN_DEBUG_OPTION; i++)
- if ((n>>i)&1) {
- errorBelch(gran_debug_opts_strs[i]);
- switch (i) {
- case 0: RtsFlags.GranFlags.Debug.event_trace = rtsTrue; break;
- case 1: RtsFlags.GranFlags.Debug.event_stats = rtsTrue; break;
- case 2: RtsFlags.GranFlags.Debug.bq = rtsTrue; break;
- case 3: RtsFlags.GranFlags.Debug.pack = rtsTrue; break;
- case 4: RtsFlags.GranFlags.Debug.checkSparkQ = rtsTrue; break;
- case 5: RtsFlags.GranFlags.Debug.thunkStealing = rtsTrue; break;
- case 6: RtsFlags.GranFlags.Debug.randomSteal = rtsTrue; break;
- case 7: RtsFlags.GranFlags.Debug.findWork = rtsTrue; break;
- case 8: RtsFlags.GranFlags.Debug.unused = rtsTrue; break;
- case 9: RtsFlags.GranFlags.Debug.pri = rtsTrue; break;
- case 10: RtsFlags.GranFlags.Debug.checkLight = rtsTrue; break;
- case 11: RtsFlags.GranFlags.Debug.sortedQ = rtsTrue; break;
- case 12: RtsFlags.GranFlags.Debug.blockOnFetch = rtsTrue; break;
- case 13: RtsFlags.GranFlags.Debug.packBuffer = rtsTrue; break;
- case 14: RtsFlags.GranFlags.Debug.blockOnFetch_sanity = rtsTrue; break;
- default: barf("set_GranSim_debug_options: only %d debug options expected");
- } /* switch */
- } /* if */
-}
-
-/*
- Print one line explanation for each of the GranSim debug options specified
- in the bitmask n.
-*/
-static void
-help_GranSim_debug_options(nat n) {
- nat i;
-
- for (i=0; i<=MAX_GRAN_DEBUG_OPTION; i++)
- if ((n>>i)&1)
- debugBelch(gran_debug_opts_strs[i]);
-}
-
-# elif defined(PAR)
-
-static void
-process_par_option(int arg, int *rts_argc, char *rts_argv[], rtsBool *error)
-{
-
- if (rts_argv[arg][1] != 'q') { /* All GUM options start with -q */
- errorBelch("Warning: GUM option does not start with -q: %s", rts_argv[arg]);
- return;
- }
-
- /* Communication and task creation cost parameters */
- switch(rts_argv[arg][2]) {
- case 'e': /* -qe<n> ... allow <n> local sparks */
- if (rts_argv[arg][3] != '\0') { /* otherwise, stick w/ the default */
- RtsFlags.ParFlags.maxLocalSparks
- = strtol(rts_argv[arg]+3, (char **) NULL, 10);
-
- if (RtsFlags.ParFlags.maxLocalSparks <= 0) {
- errorBelch("setupRtsFlags: bad value for -e\n");
- *error = rtsTrue;
- }
- }
- IF_PAR_DEBUG(verbose,
- errorBelch("-qe<n>: max %d local sparks",
- RtsFlags.ParFlags.maxLocalSparks));
- break;
-
- case 't':
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.ParFlags.maxThreads
- = strtol(rts_argv[arg]+3, (char **) NULL, 10);
- } else {
- errorBelch("missing size for -qt\n");
- *error = rtsTrue;
- }
- IF_PAR_DEBUG(verbose,
- errorBelch("-qt<n>: max %d threads",
- RtsFlags.ParFlags.maxThreads));
- break;
-
- case 'f':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.ParFlags.maxFishes = decode(rts_argv[arg]+3);
- else
- RtsFlags.ParFlags.maxFishes = MAX_FISHES;
- break;
- IF_PAR_DEBUG(verbose,
- errorBelch("-qf<n>: max %d fishes sent out at one time",
- RtsFlags.ParFlags.maxFishes));
- break;
-
- case 'F':
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.ParFlags.fishDelay
- = strtol(rts_argv[arg]+3, (char **) NULL, 10);
- } else {
- errorBelch("missing fish delay time for -qF\n");
- *error = rtsTrue;
- }
- IF_PAR_DEBUG(verbose,
- errorBelch("-qF<n>: fish delay time %d us",
- RtsFlags.ParFlags.fishDelay));
- break;
-
- case 'O':
- RtsFlags.ParFlags.outputDisabled = rtsTrue;
- IF_PAR_DEBUG(verbose,
- errorBelch("-qO: output disabled"));
- break;
-
- case 'g': /* -qg<n> ... globalisation scheme */
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.ParFlags.globalising = decode(rts_argv[arg]+3);
- } else {
- errorBelch("missing identifier for globalisation scheme (for -qg)\n");
- *error = rtsTrue;
- }
- IF_PAR_DEBUG(verbose,
- debugBelch("-qg<n>: globalisation scheme set to %d",
- RtsFlags.ParFlags.globalising));
- break;
-
- case 'h': /* -qh<n> ... max number of thunks (except root) in packet */
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.ParFlags.thunksToPack = decode(rts_argv[arg]+3);
- } else {
- errorBelch("missing number of thunks per packet (for -qh)\n");
- *error = rtsTrue;
- }
- IF_PAR_DEBUG(verbose,
- debugBelch("-qh<n>: thunks per packet set to %d",
- RtsFlags.ParFlags.thunksToPack));
- break;
-
- case 'P': /* -qP for writing a log file */
- //RtsFlags.ParFlags.ParStats.Full = rtsFalse;
- /* same encoding as in GranSim after -bP */
- switch(rts_argv[arg][3]) {
- case '\0': RtsFlags.ParFlags.ParStats.Full = rtsTrue;
- break; // nothing special, just an ordinary profile
- case '0': RtsFlags.ParFlags.ParStats.Suppressed = rtsTrue;
- RtsFlags.ParFlags.ParStats.Full = rtsFalse;
- break;
- case 'b': RtsFlags.ParFlags.ParStats.Binary = rtsTrue;
- break;
- case 's': RtsFlags.ParFlags.ParStats.Sparks = rtsTrue;
- break;
- //case 'h': RtsFlags.parFlags.ParStats.Heap = rtsTrue;
- // break;
- case 'n': RtsFlags.ParFlags.ParStats.NewLogfile = rtsTrue;
- break;
- case 'g':
-# if defined(PAR_TICKY)
- RtsFlags.ParFlags.ParStats.Global = rtsTrue;
-# else
- errorBelch("-qPg is only possible for a PAR_TICKY RTS, which this is not");
- stg_exit(EXIT_FAILURE);
-# endif
- break;
- default: barf("Unknown option -qP%c", rts_argv[arg][2]);
- }
- IF_PAR_DEBUG(verbose,
- debugBelch("(-qP) writing to log-file (RtsFlags.ParFlags.ParStats.Full=%s)",
- (RtsFlags.ParFlags.ParStats.Full ? "rtsTrue" : "rtsFalse")));
- break;
-
- case 'Q': /* -qQ<n> ... set pack buffer size to <n> */
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.ParFlags.packBufferSize = decode(rts_argv[arg]+3);
- } else {
- errorBelch("missing size of PackBuffer (for -qQ)\n");
- *error = rtsTrue;
- }
- IF_PAR_DEBUG(verbose,
- debugBelch("-qQ<n>: pack buffer size set to %d",
- RtsFlags.ParFlags.packBufferSize));
- break;
-
- case 'R':
- RtsFlags.ParFlags.doFairScheduling = rtsTrue;
- IF_PAR_DEBUG(verbose,
- debugBelch("-qR: fair-ish scheduling"));
- break;
-
-# if defined(DEBUG)
- case 'w':
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.ParFlags.wait
- = strtol(rts_argv[arg]+3, (char **) NULL, 10);
- } else {
- RtsFlags.ParFlags.wait = 1000;
- }
- IF_PAR_DEBUG(verbose,
- debugBelch("-qw<n>: length of wait loop after synchr before reduction: %d",
- RtsFlags.ParFlags.wait));
- break;
-
- case 'D': /* -qD ... all the debugging options */
- if (isdigit(rts_argv[arg][3])) {/* Set all debugging options in one */
- /* hack warning: interpret the flags as a binary number */
- nat n = decode(rts_argv[arg]+3);
- set_par_debug_options(n);
- } else {
- nat i;
- for (i=0; i<=MAX_PAR_DEBUG_OPTION; i++)
- if (rts_argv[arg][3] == par_debug_opts_flags[i])
- break;
-
- if (i==MAX_PAR_DEBUG_OPTION+1) {
- errorBelch("Valid GUM debug options are:\n");
- help_par_debug_options(MAX_PAR_DEBUG_MASK);
- bad_option( rts_argv[arg] );
- } else { // flag found; now set it
- set_par_debug_options(PAR_DEBUG_MASK(i)); // 2^i
- }
- }
- break;
-# endif
- default:
- errorBelch("Unknown option -q%c (%d opts in total)",
- rts_argv[arg][2], *rts_argc);
- break;
- } /* switch */