[GHC] #8326: Place heap checks common in case alternatives before the case
GHC
ghc-devs at haskell.org
Mon Feb 5 20:32:56 UTC 2018
#8326: Place heap checks common in case alternatives before the case
-------------------------------------+-------------------------------------
Reporter: jstolarek | Owner: (none)
Type: task | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.7
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Runtime | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking: 8317
Related Tickets: #1498 | Differential Rev(s): Phab:D343
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by michalt):
What is the status of this ticket?
I've tried the patch suggested in comment:34, but my results of nofib were
quite different, with some clear regressions (below I've removed anything
where the difference was <2%)
{{{
NoFib Results
--------------------------------------------------------------------------------
Program Size Allocs Runtime Elapsed TotalMem
--------------------------------------------------------------------------------
CSD -0.4% 0.0% +7.4% +7.4% 0.0%
S -0.5% 0.0% +3.2% +3.3% 0.0%
VS -0.5% 0.0% -4.4% -4.4% 0.0%
VSM -0.5% 0.0% +8.7% +8.7% 0.0%
bspt -0.5% 0.0% 0.003 0.003 +50.0%
constraints -0.4% 0.0% +2.5% +2.6% 0.0%
cryptarithm1 -0.4% 0.0% +6.0% +6.0% 0.0%
exact-reals -1.2% 0.0% -2.7% -2.7% 0.0%
fannkuch-redux -0.4% 0.0% -2.5% -2.5% 0.0%
fasta -0.4% 0.0% +7.7% +7.6% 0.0%
k-nucleotide -0.8% +0.0% +17.9% +18.0% 0.0%
lambda -0.4% 0.0% -2.2% -2.1% 0.0%
linear -1.2% 0.0% -5.9% -5.9% 0.0%
mate -0.4% 0.0% -2.2% -2.2% 0.0%
n-body -0.9% 0.0% +3.2% +3.2% 0.0%
--------------------------------------------------------------------------------
Min -1.4% -0.2% -5.9% -5.9% 0.0%
Max -0.2% +0.0% +17.9% +18.0% +50.0%
Geometric Mean -0.7% -0.0% +1.7% +1.6% +0.4%
}}}
I've tried to have a look into `k-nucleotide`, which slowed down the most.
My current understanding is that there's a tight loop within a single
function that goes like this:
- A: some computation, eventually goes to B
- B: case on `andI# variable 127#` (one alternative is the slow path that
allocates, the other is fast that doesn't)
- C: alternative that does a bit of computation (but no allocation) and
jumps back A
Now with the change we get a heap check in front of the case, which will
now be executed on every iteration and slow everything down.
NOTE: I don't have much experience with investigations like this, so the
whole analysis might be quite wrong. ;) Please let me know if something
seems off. I'll attach the dump of STG/cmm/asm from both versions of
`k-nucleotide` (with and without the patch).
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8326#comment:42>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list