[commit: ghc] master: GhcMake: limit Capability count to CPU count in parallel mode (9d17560)
git at git.haskell.org
git at git.haskell.org
Tue Aug 30 12:28:16 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/9d175605e52fd0d85f2548896358d96ee441c7e4/ghc
>---------------------------------------------------------------
commit 9d175605e52fd0d85f2548896358d96ee441c7e4
Author: Sergei Trofimovich <slyfox at gentoo.org>
Date: Tue Aug 30 12:10:47 2016 +0100
GhcMake: limit Capability count to CPU count in parallel mode
In Trac #9221 one of problems using high --jobs=<N>
is amount of mutator (or GC) threads we crate.
We use userspace spinning-and-yielding (see ACQUIRE_SPIN_LOCK)
to acess work stealing queues. In case of
N-worker-threads > N-CPUs fraction of time when
thread holding spin lock gets descheduled by kernel
increases. That causes other threads to waste CPU time
before giving up CPU.
Signed-off-by: Sergei Trofimovich <siarheit at google.com>
Test Plan:
ghc --make -j8 and -j80 have comparable sys time
on a 8-core system.
Reviewers: austin, gintas, bgamari, simonmar
Reviewed By: bgamari, simonmar
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D2482
GHC Trac Issues: #9221
>---------------------------------------------------------------
9d175605e52fd0d85f2548896358d96ee441c7e4
compiler/main/GhcMake.hs | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/compiler/main/GhcMake.hs b/compiler/main/GhcMake.hs
index bb1c8e3..9197b2c 100644
--- a/compiler/main/GhcMake.hs
+++ b/compiler/main/GhcMake.hs
@@ -762,7 +762,12 @@ parUpsweep n_jobs old_hpt stable_mods cleanup sccs = do
let updNumCapabilities = liftIO $ do
n_capabilities <- getNumCapabilities
- unless (n_capabilities /= 1) $ setNumCapabilities n_jobs
+ n_cpus <- getNumProcessors
+ -- Setting number of capabilities more than
+ -- CPU count usually leads to high userspace
+ -- lock contention. Trac #9221
+ let n_caps = min n_jobs n_cpus
+ unless (n_capabilities /= 1) $ setNumCapabilities n_caps
return n_capabilities
-- Reset the number of capabilities once the upsweep ends.
let resetNumCapabilities orig_n = liftIO $ setNumCapabilities orig_n
More information about the ghc-commits
mailing list