haskell-cabal.eclass: unleash full parallelism of parallel ghc
authorSergei Trofimovich <slyfox@gentoo.org>
Fri, 2 Sep 2016 09:26:43 +0000 (10:26 +0100)
committerSergei Trofimovich <slyfox@gentoo.org>
Fri, 2 Sep 2016 09:29:51 +0000 (10:29 +0100)
I've explored scalability of 'ghc --make -j' a bit in
    https://ghc.haskell.org/trac/ghc/ticket/9221

Some takeaways:
- never specify -j<N> with N > CPU. garbage collector threads
  waste kernel time running sched_yield()
- GHC allocates A Lot: large nursery decreases GC interruptions.
  We fix it with '-A256M'
- for large nursery enabling work-stealing makes GC finish faster
  on each collection cycle.
  We fix it with -qb0

While at it move HCFLAGS setup after parallel defaults.
That allows user to override defaults with own HCFLAGS.

Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
eclass/haskell-cabal.eclass

index c1a13300abb0c051a782299f2f8206120441559b..94ef7f35ad75a4e36299eacc7ad2d4cecd36a095 100644 (file)
@@ -372,24 +372,20 @@ cabal-configure() {
                cabalconf+=($(cabal-constraint "ghc"))
        fi
 
+       # parallel on all available cores
+       if ghc-supports-parallel-make; then
+               # It should have been just -j$(makeopts_jobs)
+               # but GHC does not yet have nice defaults:
+               #    https://ghc.haskell.org/trac/ghc/ticket/9221#comment:57
+               cabalconf+=(--ghc-options="-j$(makeopts_jobs) +RTS -A256M -qb0 -RTS")
+       fi
+
        local option
        for option in ${HCFLAGS}
        do
                cabalconf+=(--ghc-option="$option")
        done
 
-       # parallel on all available cores
-       if ghc-supports-parallel-make; then
-               local max_jobs=$(makeopts_jobs)
-
-               # limit to very small value, as parallelism
-               # helps slightly, but makes things severely worse
-               # when amount of threads is Very Large.
-               [[ ${max_jobs} -gt 4 ]] && max_jobs=4
-
-               cabalconf+=(--ghc-option=-j"$max_jobs")
-       fi
-
        # Building GHCi libs on ppc64 causes "TOC overflow".
        if use ppc64; then
                cabalconf+=(--disable-library-for-ghci)