diff options
author | Simon Marlow <marlowsd@gmail.com> | 2011-12-09 10:35:46 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2011-12-13 08:58:57 +0000 |
commit | a02eb298d3f6089e51a43307ffb37e3a8076c8fd (patch) | |
tree | 6174e46a959a2449b54e470c8b627e3ba1a277bb /rts/RtsFlags.c | |
parent | 55d7931d7fb55865a592f91dfa65435ee2859158 (diff) | |
download | haskell-a02eb298d3f6089e51a43307ffb37e3a8076c8fd.tar.gz |
New flag +RTS -qi<n>, avoid waking up idle Capabilities to do parallel GC
This is an experimental tweak to the parallel GC that avoids waking up
a Capability to do parallel GC if we know that the capability has been
idle for a (tunable) number of GC cycles. The idea is that if you're
only using a few Capabilities, there's no point waking up the ones
that aren't busy.
e.g. +RTS -qi3
says "A Capability will participate in parallel GC if it was running
at all since the last 3 GC cycles."
Results are a bit hit and miss, and I don't completely understand why
yet. Hence, for now it is turned off by default, and also not
documented except in the +RTS -? output.
Diffstat (limited to 'rts/RtsFlags.c')
-rw-r--r-- | rts/RtsFlags.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index 033db38435..2685d2e945 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -195,6 +195,7 @@ void initRtsFlagsDefaults(void) RtsFlags.ParFlags.parGcGen = 0; RtsFlags.ParFlags.parGcLoadBalancingEnabled = rtsTrue; RtsFlags.ParFlags.parGcLoadBalancingGen = 1; + RtsFlags.ParFlags.parGcNoSyncWithIdle = 0; RtsFlags.ParFlags.setAffinity = 0; #endif @@ -367,6 +368,9 @@ usage_text[] = { " (default: 1, -qb alone turns off load-balancing)", " -qa Use the OS to set thread affinity (experimental)", " -qm Don't automatically migrate threads between CPUs", +" -qi<n> If a processor has been idle for the last <n> GCs, do not", +" wake it up for a non-load-balancing parallel GC.", +" (0 disables, default: 0)", #endif " --install-signal-handlers=<yes|no>", " Install signal handlers (default: yes)", @@ -1193,7 +1197,11 @@ error = rtsTrue; = strtol(rts_argv[arg]+3, (char **) NULL, 10); } break; - case 'a': + case 'i': + RtsFlags.ParFlags.parGcNoSyncWithIdle + = strtol(rts_argv[arg]+3, (char **) NULL, 10); + break; + case 'a': RtsFlags.ParFlags.setAffinity = rtsTrue; break; case 'm': |