Some initial results with DPH

Austin Seipp mad.one at gmail.com
Mon Sep 22 21:48:53 EDT 2008


(I'm posting this here in the hope people like Manual and Roman will
see it and take some interest.)

I've built the GHC 6.10 beta (that is, The Glorious Glasgow Haskell
Compilation System, version 6.10.0.20080921) mainly so I could play
around with DPH because it's too exciting to ignore any longer.

The program I'm using here is pretty trivial but it's a simple enough
test case, I think. It's really cribbed from dph's examples almost
entirely, I just made some superficial data sets to test on and here
are the results.

The code is attached in a .tar file; you'll need to tweak the
Makefile to point to your GHC instead of mine if you use it.

Things to note:

* The vectorise pass boosts compilation times *a lot*. I don't think
  this is exactly unwarrented since it seems like a pretty complicated
  transformation, but while making the primitive version using just
  the unlifted interface the compilation takes about 1.5 seconds, for
  the vectorised version it's on the order of 15 seconds. For
  something as trivial as this dot-product thing, that's a bit
  of a compilation time, though.
* It's pretty much impossible to use ghc-core to examine the output
  core of the vectorised version - I let it run and before anything
  started showing up in `less` it was already using on the order of
  100mb of memory. If I just add -ddump-simpl to the command line, the
  reason is obvious: the core generated is absolutely huge.
* For the benchmark included, the vectorised ver. spends about 98% of
  its time from what I can see in the GC before it dies from stack
  overflow. I haven't tried something like +RTS -A1G -RTS yet, though.
* The vectoriser is really, really touchy. For example, the below code
  sample works (from DotPVect.hs):

> import Data.Array.Parallel.Prelude.Int as I
> 
> dotp :: [:Int:] -> [:Int:] -> Int
> dotp v w = I.sumP [: (I.*) x y | x <- v, y <- w :]

This however, does not work:

> dotp :: [:Int:] -> [:Int:] -> Int
> dotp v w = I.sumP [: (Prelude.*) x y | x <- v, y <- w :]

That is, just using the version from Prelude causes the vectoriser to
err like so:

> ghc -o vect --make test.hs -fcpr-off -threaded -Odph -funbox-strict-fields -fdph-par
> [1 of 2] Compiling DotPVect         ( DotPVect.hs, DotPVect.o )
> *** Vectorisation error ***
>     Tycon not vectorised: GHC.Num.:TNum
> make: *** [vect] Error 1
> 

This is a particularly strange occurance; reason being if we dig into
the source code of the dph-par package we see that
Data.Array.Parallel.Prelude.Int simply re-exports
Data.Array.Parallel.Prelude.Base.Int (which is a hidden module, mind
you) which is where (*) is defined, and it is defined like so:

> (+), (-), (*) :: Int -> Int -> Int
> (+) = (P.+)
> (-) = (P.-)
> (*) = (P.*)

Where 'P' is the qualified Prelude import. Am I misunderstanding
something here about how the dph packages are layed out? I think this
is pretty correct and if so it's a really really strange happening to
be honest.

I also ran into a few other errs relating to the vectoriser dying - if
I can find some I'll reply to this with some results.

So far this all seems pretty negative, but on the flip-side...

* The unlifted interface exported by the dph-prim-{par,seq} packages
  is wonderful and already works really well. See
  http://hpaste.org/10621 for an example - super low-GC time, both of
  my cores get used.
* As I have increased the data sets for the dot-product example, my
  cores continue to get used and the GC time stays really, really low
  which is a great thing.
* I've yet to hit any strange compilation err or problem when using
  the primitive packages.
* Strictly speaking the dph-{par,seq} packages seem to expose more to
  code and combinators to those pieces of code using the vectorisation
  pass, but the combinators here are simple, they work and you get
  good results.
* GHC hits a lot of optimizations, with ghc-core you can see thousands
  upon thousands of rules firing all over the place to aggressively
  inline/transform things!

The DPH work done so far seems fantastic and I realize this is all in
the works so everything I say now might not be worth anything
tomorrow, and GHC 6.10 is only shipping with a very limited version of
the system, but I figured some people would like to see initial
results on some small test cases.

I plan on exploiting this package a lot more in the future and testing
it with larger computations and data sets, and when I do I'll be sure
to give the feedback to you guys (once HEAD is steaming along again
and the 6.10 branch has calmed.)

Austin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test1.tar.gz
Type: application/x-gzip
Size: 845 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20080922/956c7e27/test1.tar.bin


More information about the Glasgow-haskell-users mailing list