[Haskell] Haskell fast (?) arrays

Donald Bruce Stewart dons at cse.unsw.edu.au
Tue May 1 11:00:24 EDT 2007


federico.squartini:
> 
>    Of course I know that the list version is very unfair, but I
>    wanted to see what was the trade off between elegance and
>    speed.
>    Regarding whether low level programming makes sense or not,
>    I was just curious to see what are the limits of Haskell.
>    Moreover there is not much literature on high performance
>    Haskell programming (tricks like unsafeWrite), at least
>    organized in a systematic and concise way.
>    My original problem was writing a  fast library for simple
>    matrix computations (i.e. multiplication and inversion for
>    small dense matrices).  I have not been able to make
>    GSLHaskell work with Lapack so far. :(
>    Anyway here are the new versions and timings, I increased
>    the number of times the vector is reversed, I also compiled
>    everything with -O2.

Probably a good idea to use techniques from Data.ByteString (ie. use
strict Ptr loops, and Foreign arrays), or techniques from the shootout,
if you're chasing C speed. Good examples are:

    http://shootout.alioth.debian.org/gp4/benchmark.php?test=nsievebits&lang=ghc&id=4
    (mutable bit arrays)

    http://shootout.alioth.debian.org/gp4/benchmark.php?test=nsieve&lang=ghc&id=0
    (mutable byte (foreign) arrays)

    http://shootout.alioth.debian.org/gp4/benchmark.php?test=spectralnorm&lang=ghc&id=4
    (more mutable arrays)

When I really really care about speed, I use 

    Foreign.Marshal.Array
    Data.ByteString

and apply ! patterns liberally, checking the Core output for inner
loops. -O2 -optc-O2 -optc-march=pentium4 often helps.

1-4x C is around what you can best hope for. 10x says "still room for
improvement" in my experience.

-- Don


More information about the Haskell mailing list