| commit 501e05bb1b8974fc8b6c9eee86c87c367e87a211 |
| Author: Sergei Trofimovich <slyfox@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@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 |
| |
| diff --git a/compiler/main/GhcMake.hs b/compiler/main/GhcMake.hs |
| index 9dc43cd..905df63 100644 |
| --- a/compiler/main/GhcMake.hs |
| +++ b/compiler/main/GhcMake.hs |
| @@ -761,7 +761,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 |