- if (rts_argv[arg][1] != 'b') /* All GranSim options start with -b */
- return;
-
- /* or a ridiculously idealised simulator */
- if(strcmp((rts_argv[arg]+2),"oring")==0) {
- RtsFlags.GranFlags.Costs.latency =
- RtsFlags.GranFlags.Costs.fetchtime =
- RtsFlags.GranFlags.Costs.additional_latency =
- RtsFlags.GranFlags.Costs.gunblocktime =
- RtsFlags.GranFlags.Costs.lunblocktime =
- RtsFlags.GranFlags.Costs.threadcreatetime =
- RtsFlags.GranFlags.Costs.threadqueuetime =
- RtsFlags.GranFlags.Costs.threadscheduletime =
- RtsFlags.GranFlags.Costs.threaddescheduletime =
- RtsFlags.GranFlags.Costs.threadcontextswitchtime = 0;
-
- RtsFlags.GranFlags.Costs.mpacktime =
- RtsFlags.GranFlags.Costs.munpacktime = 0;
-
- RtsFlags.GranFlags.Costs.arith_cost =
- RtsFlags.GranFlags.Costs.float_cost =
- RtsFlags.GranFlags.Costs.load_cost =
- RtsFlags.GranFlags.Costs.store_cost =
- RtsFlags.GranFlags.Costs.branch_cost = 0;
-
- RtsFlags.GranFlags.Costs.heapalloc_cost = 1;
-
- /* ++RtsFlags.GranFlags.DoFairSchedule; */
- RtsFlags.GranFlags.DoStealThreadsFirst = rtsTrue; /* -bZ */
- RtsFlags.GranFlags.DoThreadMigration = rtsTrue; /* -bM */
- RtsFlags.GranFlags.GranSimStats.Full = rtsTrue; /* -bP */
- return;
- }
-
- /* or a somewhat idealised simulator */
- if(strcmp((rts_argv[arg]+2),"onzo")==0) {
- RtsFlags.GranFlags.Costs.latency =
- RtsFlags.GranFlags.Costs.fetchtime =
- RtsFlags.GranFlags.Costs.additional_latency =
- RtsFlags.GranFlags.Costs.gunblocktime =
- RtsFlags.GranFlags.Costs.lunblocktime =
- RtsFlags.GranFlags.Costs.threadcreatetime =
- RtsFlags.GranFlags.Costs.threadqueuetime =
- RtsFlags.GranFlags.Costs.threadscheduletime =
- RtsFlags.GranFlags.Costs.threaddescheduletime =
- RtsFlags.GranFlags.Costs.threadcontextswitchtime = 0;
-
- RtsFlags.GranFlags.Costs.mpacktime =
- RtsFlags.GranFlags.Costs.munpacktime = 0;
-
- RtsFlags.GranFlags.Costs.heapalloc_cost = 1;
-
- /* RtsFlags.GranFlags.DoFairSchedule = rtsTrue; */ /* -b-R */
- /* RtsFlags.GranFlags.DoStealThreadsFirst = rtsTrue; */ /* -b-T */
- RtsFlags.GranFlags.DoAsyncFetch = rtsTrue; /* -bZ */
- RtsFlags.GranFlags.DoThreadMigration = rtsTrue; /* -bM */
- RtsFlags.GranFlags.GranSimStats.Full = rtsTrue; /* -bP */
-# if defined(GRAN_CHECK) && defined(GRAN)
- RtsFlags.GranFlags.Debug.event_stats = rtsTrue; /* print event statistics */
-# endif
- return;
- }
-
- /* Communication and task creation cost parameters */
- switch(rts_argv[arg][2]) {
- case '.':
- IgnoreYields = rtsTrue; // HWL HACK
- break;
-
- case ':':
- enable_GranSimLight(); /* set flags for GrAnSim-Light mode */
- break;
-
- case 'l':
- if (rts_argv[arg][3] != '\0')
- {
- RtsFlags.GranFlags.Costs.gunblocktime =
- RtsFlags.GranFlags.Costs.latency = decode(rts_argv[arg]+3);
- RtsFlags.GranFlags.Costs.fetchtime = 2*RtsFlags.GranFlags.Costs.latency;
- }
- else
- RtsFlags.GranFlags.Costs.latency = LATENCY;
- break;
-
- case 'a':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.additional_latency = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.additional_latency = ADDITIONAL_LATENCY;
- break;
-
- case 'm':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.mpacktime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.mpacktime = MSGPACKTIME;
- break;
-
- case 'x':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.mtidytime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.mtidytime = 0;
- break;
-
- case 'r':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.munpacktime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.munpacktime = MSGUNPACKTIME;
- break;
-
- case 'g':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.fetchtime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.fetchtime = FETCHTIME;
- break;
-
- case 'n':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.gunblocktime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.gunblocktime = GLOBALUNBLOCKTIME;
- break;
-
- case 'u':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.lunblocktime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.lunblocktime = LOCALUNBLOCKTIME;
- break;
-
- /* Thread-related metrics */
- case 't':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.threadcreatetime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.threadcreatetime = THREADCREATETIME;
- break;
-
- case 'q':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.threadqueuetime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.threadqueuetime = THREADQUEUETIME;
- break;
-
- case 'c':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.threadscheduletime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.threadscheduletime = THREADSCHEDULETIME;
-
- RtsFlags.GranFlags.Costs.threadcontextswitchtime = RtsFlags.GranFlags.Costs.threadscheduletime
- + RtsFlags.GranFlags.Costs.threaddescheduletime;
- break;
-
- case 'd':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.threaddescheduletime = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.threaddescheduletime = THREADDESCHEDULETIME;
-
- RtsFlags.GranFlags.Costs.threadcontextswitchtime = RtsFlags.GranFlags.Costs.threadscheduletime
- + RtsFlags.GranFlags.Costs.threaddescheduletime;
- break;
-
- /* Instruction Cost Metrics */
- case 'A':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.arith_cost = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.arith_cost = ARITH_COST;
- break;
-
- case 'F':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.float_cost = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.float_cost = FLOAT_COST;
- break;
-
- case 'B':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.branch_cost = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.branch_cost = BRANCH_COST;
- break;
-
- case 'L':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.load_cost = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.load_cost = LOAD_COST;
- break;
-
- case 'S':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.store_cost = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.store_cost = STORE_COST;
- break;
-
- case 'H':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.heapalloc_cost = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.heapalloc_cost = 0;
- break;
-
- case 'y':
- RtsFlags.GranFlags.DoAsyncFetch = rtsTrue;
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.FetchStrategy = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.FetchStrategy = 2;
- if (RtsFlags.GranFlags.FetchStrategy == 0)
- RtsFlags.GranFlags.DoAsyncFetch = rtsFalse;
- break;
-
- case 'K': /* sort overhead (per elem in spark list) */
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.pri_spark_overhead = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.pri_spark_overhead = PRI_SPARK_OVERHEAD;
- debugBelch("Overhead for pri spark: %d (per elem).\n",
- RtsFlags.GranFlags.Costs.pri_spark_overhead);
- break;
-
- case 'O': /* sort overhead (per elem in spark list) */
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.Costs.pri_sched_overhead = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.Costs.pri_sched_overhead = PRI_SCHED_OVERHEAD;
- debugBelch("Overhead for pri sched: %d (per elem).\n",
- RtsFlags.GranFlags.Costs.pri_sched_overhead);
- break;
-
- /* General Parameters */
- case 'p':
- if (rts_argv[arg][3] != '\0')
- {
- RtsFlags.GranFlags.proc = decode(rts_argv[arg]+3);
- if (RtsFlags.GranFlags.proc==0) {
- enable_GranSimLight(); /* set flags for GrAnSim-Light mode */
- } else if (RtsFlags.GranFlags.proc > MAX_PROC ||
- RtsFlags.GranFlags.proc < 1)
- {
- debugBelch("setupRtsFlags: no more than %u processors allowed\n",
- MAX_PROC);
- *error = rtsTrue;
- }
- }
- else
- RtsFlags.GranFlags.proc = MAX_PROC;
- break;
-
- case 'f':
- RtsFlags.GranFlags.Fishing = rtsTrue;
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.maxFishes = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.maxFishes = MAX_FISHES;
- break;
-
- case 'w':
- if (rts_argv[arg][3] != '\0')
- RtsFlags.GranFlags.time_slice = decode(rts_argv[arg]+3);
- else
- RtsFlags.GranFlags.time_slice = GRAN_TIME_SLICE;
- break;
-
- case 'C':
- RtsFlags.GranFlags.DoAlwaysCreateThreads=rtsTrue;
- RtsFlags.GranFlags.DoThreadMigration=rtsTrue;
- break;
-
- case 'G':
- debugBelch("Bulk fetching enabled.\n");
- RtsFlags.GranFlags.DoBulkFetching=rtsTrue;
- break;
-
- case 'M':
- debugBelch("Thread migration enabled.\n");
- RtsFlags.GranFlags.DoThreadMigration=rtsTrue;
- break;
-
- case 'R':
- debugBelch("Fair Scheduling enabled.\n");
- RtsFlags.GranFlags.DoFairSchedule=rtsTrue;
- break;
-
- case 'I':
- debugBelch("Priority Scheduling enabled.\n");
- RtsFlags.GranFlags.DoPriorityScheduling=rtsTrue;
- break;
-
- case 'T':
- RtsFlags.GranFlags.DoStealThreadsFirst=rtsTrue;
- RtsFlags.GranFlags.DoThreadMigration=rtsTrue;
- break;
-
- case 'Z':
- RtsFlags.GranFlags.DoAsyncFetch=rtsTrue;
- break;
-
-/* case 'z': */
-/* RtsFlags.GranFlags.SimplifiedFetch=rtsTrue; */
-/* break; */
-
- case 'N':
- RtsFlags.GranFlags.PreferSparksOfLocalNodes=rtsTrue;
- break;
-
- case 'b':
- RtsFlags.GranFlags.GranSimStats.Binary=rtsTrue;
- break;
-
- case 'P':
- /* format is -bP<c> where <c> is one char describing kind of profile */
- RtsFlags.GranFlags.GranSimStats.Full = rtsTrue;
- switch(rts_argv[arg][3]) {
- case '\0': break; // nothing special, just an ordinary profile
- case '0': RtsFlags.GranFlags.GranSimStats.Suppressed = rtsTrue;
- break;
- case 'b': RtsFlags.GranFlags.GranSimStats.Binary = rtsTrue;
- break;
- case 's': RtsFlags.GranFlags.GranSimStats.Sparks = rtsTrue;
- break;
- case 'h': RtsFlags.GranFlags.GranSimStats.Heap = rtsTrue;
- break;
- case 'n': RtsFlags.GranFlags.GranSimStats.NewLogfile = rtsTrue;
- break;
- case 'g': RtsFlags.GranFlags.GranSimStats.Global = rtsTrue;
- break;
- default: barf("Unknown option -bP%c", rts_argv[arg][3]);
- }
- break;