[GHC] #9281: Rewrite `integer-gmp` to use only non-allocating GMP functions

GHC ghc-devs at haskell.org
Wed Nov 12 10:04:57 UTC 2014


#9281: Rewrite `integer-gmp` to use only non-allocating GMP functions
-------------------------------------+-------------------------------------
              Reporter:  hvr         |            Owner:  hvr
                  Type:  task        |           Status:  patch
              Priority:  normal      |        Milestone:  7.10.1
             Component:  Core        |          Version:
  Libraries                          |         Keywords:  integer-gmp
            Resolution:              |     Architecture:  Unknown/Multiple
      Operating System:              |       Difficulty:  Unknown
  Unknown/Multiple                   |       Blocked By:
       Type of failure:              |  Related Tickets:  #8647
  None/Unknown                       |
             Test Case:              |
              Blocking:              |
Differential Revisions:  Phab:D82    |
-------------------------------------+-------------------------------------

Comment (by Herbert Valerio Riedel <hvr@…>):

 In [changeset:"c774b28f76ee4c220f7c1c9fd81585e0e3af0e8a/ghc"]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="c774b28f76ee4c220f7c1c9fd81585e0e3af0e8a"
 Implement new integer-gmp2 from scratch (re #9281)

 This is done as a separate `integer-gmp2` backend library because it
 turned out to become a complete rewrite from scratch.

 Due to the different (over)allocation scheme and potentially different
 accounting (via the new `{shrink,resize}MutableByteArray#` primitives),
 some of the nofib benchmarks actually results in increased allocation
 numbers (but not necessarily an increase in runtime!).  I believe the
 allocation numbers could improve if `{resize,shrink}MutableByteArray#`
 could be optimised to reallocate in-place more efficiently.

 Here are the more apparent changes in the latest nofib comparision
 between `integer-gmp` and `integer-gmp2`:

   ------------------------------------------------------------------
           Program     Size    Allocs   Runtime   Elapsed  TotalMem
   ------------------------------------------------------------------
               ...
        bernouilli    +1.6%    +15.3%     0.132     0.132      0.0%
               ...
      cryptarithm1    -2.2%      0.0%     -9.7%     -9.7%      0.0%
               ...
             fasta    -0.7%     -0.0%    +10.9%    +10.9%      0.0%
               ...
             kahan    +0.6%    +38.9%     0.169     0.169      0.0%
               ...
              lcss    -0.7%     -0.0%     -6.4%     -6.4%      0.0%
               ...
            mandel    +1.6%    +33.6%     0.049     0.049      0.0%
               ...
          pidigits    +0.8%     +8.5%     +3.9%     +3.9%      0.0%
             power    +1.4%    -23.8%    -18.6%    -18.6%    -16.7%
               ...
         primetest    +1.3%    +50.1%     0.085     0.085      0.0%
               ...
               rsa    +1.6%    +53.4%     0.026     0.026      0.0%
               ...
               scs    +1.2%     +6.6%     +6.5%     +6.6%    +14.3%
               ...
            symalg    +1.0%     +9.5%     0.010     0.010      0.0%
               ...
         transform    -0.6%     -0.0%     -5.9%     -5.9%      0.0%
               ...
   ------------------------------------------------------------------
               Min    -2.3%    -23.8%    -18.6%    -18.6%    -16.7%
               Max    +1.6%    +53.4%    +10.9%    +10.9%    +14.3%
    Geometric Mean    -0.3%     +1.9%     -0.8%     -0.8%     +0.0%

 (see P35 / https://phabricator.haskell.org/P35 for full report)

 By default, `INTEGER_LIBRARY=integer-gmp2` is active now, which results
 in the package `integer-gmp-1.0.0.0` being registered in the package db.
 The previous `integer-gmp-0.5.1.0` can be restored by setting
 `INTEGER_LIBRARY=integer-gmp` (but will probably be removed altogether
 for GHC 7.12). In-tree GMP support has been stolen from the old
 `integer-gmp` (while unpatching the custom memory-allocators, as well as
 forcing `-fPIC`)

 A minor hack to `ghc-cabal` was necessary in order to support two
 different
 `integer-gmp` packages (in different folders) with the same package key.

 There will be a couple of follow-up commits re-implementing some features
 that were dropped to keep D82 minimal, as well as further
 clean-ups/improvements.

 More information can be found via #9281 and
 https://ghc.haskell.org/trac/ghc/wiki/Design/IntegerGmp2

 Reviewed By: austin, rwbarton, simonmar

 Differential Revision: https://phabricator.haskell.org/D82
 }}}

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


More information about the ghc-tickets mailing list