Replacement for GMP: Update
Simon Peyton-Jones
simonpj at microsoft.com
Thu Aug 10 03:34:55 EDT 2006
Sounds good!
Remember that the memory-allocation mechanism is crucial. How does BN
do that?
| (3) I have been looking at how to implement a dual-constructor-in-a-
| pointer for Integer (i.e., merge constructors of small Integers and
| big Integers into the Int#). Would that solution be workable or
| might it break current Haskell programs? Just a thought.
Making a single word contain either a pointer or a non-pointer
(depending on the setting of some bit) would have some quite global
implications, as would losing 32 bit precision from Int#. I suggest
that you do not couple these two projects together! Do the GMP thing
first, then investigate this later. We have quite a few bit-twidding
ideas that we have never followed up.
Simon
| -----Original Message-----
| From: Peter Tanski [mailto:p.tanski at gmail.com]
| Sent: 10 August 2006 06:32
| To: Simon Peyton-Jones; Simon Marlow; Esa Ilari Vuokko; John Meacham
| Cc: glasgow-haskell-users at haskell.org
| Subject: Replacement for GMP: Update
|
| Simon PJ, Simon, Esa and John,
|
| Here is an update on what I have been doing so far in making a grand
| attempt to replace GMP.
|
| (1) evaluate replacement libraries
| LibTomMath:
| Pros-
| * has all the operators GMP offered
| Cons-
| * slow; about half as fast as OpenSSL in my tests for
simple
| mathematical operations, much slower if you account
for time to
| write or resize memory. (There is another MP library,
which
| LibTomMath is based on, that is also very
slow--student work)
| * not even reentrant; needs significant modification
| * beta-release; needs a bit of work to get it to
production level
| * configuration needs to be written (not really
portable, messy)
| ARPREC:
| Pros-
| * very fast (essentially does everything through the
| Floating Point Unit of a CPU)
| * complex mathematical operations
| * very precise
| * already thread safe (through C++ thread-safe statics)
| Cons-
| * no bitwise operations (not even left and right-shifts)
| * difficult configuration (everything runs by setting a
precision
| level;
| ("precision level" ~= number of words (doubles) in
array)
| it does not automatically resize memory; conversion
from
| MP Real to Integer relies specially on careful
precision-level)
| * memory inefficient (underestimates the number of real
digits you
| can fit into a double, i.e., a 64-bit double has 48
bits of
| precision,
| holding about 9.6 digits per byte, resulting in an
848-byte array
| to hold an MP number with 1000 digits).
| OpenSSL:
| Crypto++ (http://www.eskimo.com/~weidai/cryptlib.html):
| Botan (http://botan.randombit.net/):
| Pros-
| * all of these are fast, since all use Integers to
support
| cryptography;
| (Crypto++ and Botan are C++ crypto-libraries, all
licenses good)
| * all of these provide most basic mathematical
operations
| Cons-
| * none of these provide &, |, ^(xor) bitwise operators
| * Botan has least mathematical operators of the three
| * none provide lcm operator
| * all would realistically have to have the Integer
libraries stripped
| out of the distribution and repackaged for GHC
|
| Summary: I finally settled on modifying OpenSSL, since that would be
| the easiest to work with under GHC's hood (plain C code, not C++). I
| have to:
| a. make OpenSSL's BN thread-safe (add thread local storage, at
least)
| b. optimally add configure-conditional parallelism to BN
(through PVM)
| c. add &, |, ^, lcm and a few other operations
| d. separate the BN from the rest of OpenSSL and rename the
symbols
| to avoid conflicts (necessary because I have to modify the library
| anyway)
|
| (2) work on GHC:
| * finally understand C--; know what I need to modify
| * work through Makefiles: touch and go; I haven't mapped out all
the
| variable settings from configure.in on down when it comes to
DLLs
| Comment:
| for the Makefile in ghc/rts, in lines 300-346,
| GC_HC_OPTS += -optc-O3
| --isn't this problematic? gcc, from -O2 on includes
-fgcse which may
| *reduce* runtime performance in programs using
computed gotos;
| -fgcse is actually run twice, because
-frerun-cse-after-loop is also
| set at -O2. Would it be better to pass individual
flags, such as
| -funroll-loops and -falign-loops=16 (ppc, Intel
setting)?
|
| (3) I have been looking at how to implement a dual-constructor-in-a-
| pointer for Integer (i.e., merge constructors of small Integers and
| big Integers into the Int#). Would that solution be workable or
| might it break current Haskell programs? Just a thought.
|
| -Peter
|
|
More information about the Glasgow-haskell-users
mailing list