[GHC] #14980: Runtime performance regression with binary operations on vectors

GHC ghc-devs at haskell.org
Tue Oct 23 14:02:23 UTC 2018


#14980: Runtime performance regression with binary operations on vectors
-------------------------------------+-------------------------------------
        Reporter:  ttylec            |                Owner:  bgamari
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:  8.8.1
       Component:  Compiler          |              Version:  8.2.2
      Resolution:                    |             Keywords:  vector
                                     |  bitwise operations
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Runtime           |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by ttylec):

 Sorry for long inactivity.

 I had some time to do more tests recently, based on your suggestions.

 To focus attention, I tried to investigate difference between:

 - `performance-bug-pair-1`: 256 columns
 - `performance-bug-pair-2`: 64 and 256, the same code as in `performance-
 bug-pair-1` but with 64 column check uncommented

 On ghc-8.2.2 and ghc-8.0.2.

 - on ghc-8.2.2, `performance-bug-pair-2` behaves as expected -- we have
 speedup for both 64 and 256 columns, `performance-bug-pair-1` does not
 have speed-up.
 - on ghc-8.0.2, I see speedup in both cases.

 Based on @tdammers example, I tried to print fired rules difference
 between both `performance-bug-pair-1` and `performance-bug-pair-2`, using
 analogous diff expression:

 {{{
 ➜  ghc-bug diff <(grep '^Rule' rules-firing1-1 | sort -u) <(grep '^Rule'
 rules-firing-2 | sort -u) -u | grep '^[+-]'

 --- /proc/self/fd/13    2018-10-23 15:49:27.063541325 +0200
 +++ /proc/self/fd/14    2018-10-23 15:49:27.067541342 +0200
 -Rule fired: eftIntList (GHC.Enum)
 -Rule fired: stream/unstream [Vector] (Data.Vector.Generic)
 +Rule fired: SPEC matchPacked @ BPack4 (Main)
 +Rule fired: SPEC matchPacked @ BPack (Main)
 }}}

 `-` are rules that fired for `performance-bug-pair-1` (the bad) and `+`
 are rules that fired for `performance-bug-pair-2`.

 It's not about specialization, because I even tried to compile with
 `performance-bug-pair-1` with explicit monomorphic type.

 The only common rule on both rules, that fired in bad case and did not
 fire in good is `Rule fired: stream/unstream [Vector]
 (Data.Vector.Generic)`.

 Not that I understand it... but it seems that firing that rule interferes
 with some GHC optimizations?

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14980#comment:28>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list