[commit: packages/integer-gmp] wip/T8647: Allocate initial 1-limb mpz_t on the Stack and introduce MPZ# type (20d7bfd)
Simon Peyton Jones
simonpj at microsoft.com
Mon Jan 13 09:00:34 UTC 2014
Would it be worth adding some info from the commit message to the comment with type MPZ#? In particular, the little table you give in the commit message is helpful, but someone looking at the code won't see it. This is subtle stuff.
Simon
| -----Original Message-----
| From: ghc-commits [mailto:ghc-commits-bounces at haskell.org] On Behalf Of
| git at git.haskell.org
| Sent: 12 January 2014 23:37
| To: ghc-commits at haskell.org
| Subject: [commit: packages/integer-gmp] wip/T8647: Allocate initial 1-
| limb mpz_t on the Stack and introduce MPZ# type (20d7bfd)
|
| Repository : ssh://git@git.haskell.org/integer-gmp
|
| On branch : wip/T8647
| Link :
| http://ghc.haskell.org/trac/ghc/changeset/20d7bfdd29917f5a8b8937fba9b724
| f7e71cd8dd/integer-gmp
|
| >---------------------------------------------------------------
|
| commit 20d7bfdd29917f5a8b8937fba9b724f7e71cd8dd
| Author: Herbert Valerio Riedel <hvr at gnu.org>
| Date: Thu Jan 9 00:19:31 2014 +0100
|
| Allocate initial 1-limb mpz_t on the Stack and introduce MPZ# type
|
| We now allocate a 1-limb mpz_t on the stack instead of doing a more
| expensive heap-allocation (especially if the heap-allocated copy
| becomes
| garbage right away); this addresses #8647.
|
| In order to delay heap allocations of 1-limb `ByteArray#`s instead
| of
| the previous `(# Int#, ByteArray# #)` pair, a 3-tuple
| `(# Int#, ByteArray#, Word# #)` is returned now. This tuple is given
| the
| type-synonym `MPZ#`.
|
| This 3-tuple representation uses either the 1st and the 2nd element,
| or
| the 1st and the 3rd element to represent the limb(s) (NB: undefined
| `ByteArray#` elements must not be accessed as they don't point to a
| proper `ByteArray#`, see also `DUMMY_BYTE_ARR`); more specifically,
| the
| following encoding is used (where `⊥` means undefined/unused):
|
| - (# 0#, ⊥, 0## #) -> value = 0
| - (# 1#, ⊥, w #) -> value = w
| - (# -1#, ⊥, w #) -> value = -w
| - (# s#, d, 0## #) -> value = J# s d
|
| The `mpzToInteger` helper takes care of converting `MPZ#` into an
| `Integer`, and allocating a 1-limb `ByteArray#` in case the
| value (`w`/`-w`) doesn't fit the `S# Int#` representation).
|
| The following nofib benchmarks benefit from this optimization:
|
| Program Size Allocs Runtime Elapsed TotalMem
| ------------------------------------------------------------------
| bernouilli +0.2% -5.2% 0.12 0.12 +0.0%
| gamteb +0.2% -1.7% 0.03 0.03 +0.0%
| kahan +0.3% -13.2% 0.17 0.17 +0.0%
| mandel +0.2% -24.6% 0.04 0.04 +0.0%
| power +0.2% -2.6% -2.0% -2.0% -8.3%
| primetest +0.1% -17.3% 0.06 0.06 +0.0%
| rsa +0.2% -18.5% 0.02 0.02 +0.0%
| scs +0.1% -2.9% -0.1% -0.1% +0.0%
| sphere +0.3% -0.8% 0.03 0.03 +0.0%
| symalg +0.2% -3.1% 0.01 0.01 +0.0%
| ------------------------------------------------------------------
| Min +0.1% -24.6% -4.6% -4.6% -8.3%
| Max +0.3% +0.0% +5.9% +5.9% +4.5%
| Geometric Mean +0.2% -1.0% +0.2% +0.2% -0.0%
|
| Signed-off-by: Herbert Valerio Riedel <hvr at gnu.org>
|
|
| >---------------------------------------------------------------
|
| 20d7bfdd29917f5a8b8937fba9b724f7e71cd8dd
| GHC/Integer/GMP/Prim.hs | 88 ++++++++++++-------
| GHC/Integer/Type.lhs | 160 +++++++++++++++------------------
| cbits/gmp-wrappers.cmm | 224 +++++++++++++++++++++++++++++++++-------
| -------
| 3 files changed, 285 insertions(+), 187 deletions(-)
|
| Diff suppressed because of size. To see it, use:
|
| git diff-tree --root --patch-with-stat --no-color --find-copies-
| harder --ignore-space-at-eol --cc
| 20d7bfdd29917f5a8b8937fba9b724f7e71cd8dd
| _______________________________________________
| ghc-commits mailing list
| ghc-commits at haskell.org
| http://www.haskell.org/mailman/listinfo/ghc-commits
More information about the ghc-devs
mailing list