performance regressions

Simon Peyton Jones simonpj at microsoft.com
Tue Dec 16 13:49:05 UTC 2014


|  Using this combinator instead of writing the algorithm directly cost
|  me 30% allocation overhead!

That seems surprising.  I'd build a profiled compiler (GhcProfiled=YES) and see what it says.  

If it increases allocation by 30% overall, there must be a LOT of calls to this function.  Should there be so many?

S

|  -----Original Message-----
|  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of
|  Richard Eisenberg
|  Sent: 16 December 2014 04:49
|  To: Ben Gamari
|  Cc: Joachim Breitner; ghc-devs at haskell.org
|  Subject: Re: performance regressions
|  
|  I've made progress, but still need some help.
|  
|  It turns out that a monadic combinator (that I wrote) is mostly
|  responsible:
|  
|  > zipWithAndUnzipM :: Monad m
|  >                  => (a -> b -> m (c, d)) -> [a] -> [b] -> m ([c],
|  [d])
|  > zipWithAndUnzipM f (x:xs) (y:ys)
|  >   = do { (c, d) <- f x y
|  >        ; (cs, ds) <- zipWithAndUnzipM f xs ys
|  >        ; return (c:cs, d:ds) }
|  > zipWithAndUnzipM _ _ _ = return ([], [])
|  >
|  
|  Using this combinator instead of writing the algorithm directly cost
|  me 30% allocation overhead!
|  
|  Can anyone tell me: why? Have I made some horrible mistake in the
|  implementation?
|  And, relatedly: how can I fix this? I want to learn from this
|  experience how to avoid this problem next time...
|  
|  Unfortunately, my commit causes 50% overhead, not 30%, so I'm not out
|  of the woods yet. Hopefully, another 20% of good news tomorrow.
|  
|  Thanks!
|  Richard
|  
|  On Dec 15, 2014, at 11:33 AM, Ben Gamari <ben at smart-cactus.org> wrote:
|  
|  > Joachim Breitner <nomeata at debian.org> writes:
|  >
|  >> Hi,
|  >>
|  >> Am Montag, den 15.12.2014, 10:58 -0500 schrieb Ben Gamari:
|  >>>>> - Travis has not picked up on these errors.
|  >>>>
|  >>>> unfortunately, travis is slighly less useful since a few weeks
|  due
|  >>>> to
|  >>>> T5681 failing (possibly due to the use of LLVM-3.4), but I'm
|  still
|  >>>> waiting for an reply on that issue.
|  >>>>
|  >>> You aren't looking for a response from me on this, are you? I just
|  >>> checked and I don't seem to have any outstanding messages from you
|  >>> but it's entirely possible I overlooked something.
|  >>
|  >> this is independent of our arm issues, and I think a tad older; I
|  did
|  >> not direct it to anyone specific.
|  >>
|  >> But I guess you are likely a person that can tell what's wrong
|  here:
|  >>
|  >> Am Sonntag, den 30.11.2014, 20:01 +0100 schrieb Joachim Breitner:
|  >>> Compile failed (status 256) errors were:
|  >>> /tmp/ghc16123_0/ghc16123_5.s: Assembler messages:
|  >>>
|  >>> /tmp/ghc16123_0/ghc16123_5.s:26:0:
|  >>>     Error: can't resolve `.rodata' {.rodata section} -
|  >>> `Main_zdwwork_info$def' {.text section}
|  >>>
|  >>> /tmp/ghc16123_0/ghc16123_5.s:46:0:
|  >>>     Error: can't resolve `.rodata' {.rodata section} -
|  >>> `Main_work_info$def' {.text section}
|  >>>
|  >>> /tmp/ghc16123_0/ghc16123_5.s:66:0:
|  >>>     Error: can't resolve `.rodata' {.rodata section} -
|  >>> `Main_main1_info$def' {.text section}
|  >>>
|  >>> /tmp/ghc16123_0/ghc16123_5.s:86:0:
|  >>>     Error: can't resolve `.rodata' {.rodata section} -
|  >>> `Main_main_info$def' {.text section}
|  >>>
|  >>> /tmp/ghc16123_0/ghc16123_5.s:106:0:
|  >>>     Error: can't resolve `.rodata' {.rodata section} -
|  >>> `Main_main2_info$def' {.text section}
|  >>>
|  >>> /tmp/ghc16123_0/ghc16123_5.s:126:0:
|  >>>     Error: can't resolve `.rodata' {.rodata section} -
|  >>> `ZCMain_main_info$def' {.text section}
|  >>>
|  >>> *** unexpected failure for T5681(optllvm)
|  >>>
|  >>> https://s3.amazonaws.com/archive.travis-
|  ci.org/jobs/42557559/log.txt
|  >>>
|  >>> Any ideas?
|  >>
|  >> Is it possible that this is due the llvm version used? Do we
|  support
|  >> 3.4 in GHC HEAD?
|  >>
|  >>   Using LLVM tools
|  >>      llc   : /usr/local/clang-3.4/bin/llc
|  >>      opt   : /usr/local/clang-3.4/bin/opt
|  >>
|  >> (http://smart-cactus.org/~ben/posts/2014-11-28-state-of-llvm-
|  backend.
|  >> html does not talk about GHC HEAD explicitly. Should I look at the
|  >> 7.10 row? Does that mean that 3.4 is not supported? Shouldn't the
|  >> build system, or at least the compiler, fail harder and more
|  >> helpfully in this case?)
|  >>
|  > LLVM 3.4 appears to have an unfortunate behavior whereby it will
|  lose
|  > track of which section symbols with Internal linkage belong.  I
|  > haven't had a chance to delve into this too deeply, however given
|  that
|  > both 3.3 and
|  > 3.5 behave as expected I'm pretty sure this a bug. There are a few
|  > options here,
|  >
|  >  a. Mark the `$def` symbols as ExternallyVisible, working around the
|  > issue at the expense of exposing internal symbols to the outside
|  > world.
|  >
|  >  b. Mark LLVM 3.4 as unsupported
|  >
|  > At the moment I'm leaning towards (b) since I haven't had a chance
|  to
|  > think through the implications of (a); if nothing else I suspect
|  this
|  > wouldn't help the DLL symbol table size issues on Windows. Giving up
|  > on LLVM 3.4 might be unfortunate for a good number of users,
|  however.
|  >
|  > Ultimately this underlines the need to package LLVM with GHC.
|  >
|  > Cheers,
|  >
|  > - Ben
|  >
|  >
|  > _______________________________________________
|  > ghc-devs mailing list
|  > ghc-devs at haskell.org
|  > http://www.haskell.org/mailman/listinfo/ghc-devs
|  
|  _______________________________________________
|  ghc-devs mailing list
|  ghc-devs at haskell.org
|  http://www.haskell.org/mailman/listinfo/ghc-devs


More information about the ghc-devs mailing list