GHC/Data Parallel Haskell/Package NDP
Speed with less convenience: package ndp
The concurrent, high-performance library of strict, segmented arrays mentioned above takes the form of a GHC package called ndp. This package is under development and only available in source form. The simplest way to build it is to first get and build a source distribution of GHC (preferably the current development version) - see the docu on how to get the sources and how to build them. Then, in the source tree, do the following
% cd libraries % darcs get http://darcs.haskell.org/packages/ndp/ % cd ndp % make boot % make
Now, the option -package ndp is available for use with the inplace compiler (i.e., compiler/ghc-inplace). Alternatively, you can install it by invoking make install on the GHC source root and within libraries/ndp/. Then, the option -package ndp can be used in the installed compiler.
For example, the following module implements the dot product with package ndp:
module DotP_ndp (dotp) where import Data.Array.Parallel.Unlifted dotp :: (Num a, UA a) => UArr a -> UArr a -> a dotp xs ys = sumU (zipWithU (*) xs ys)
We can also use that in an interactive GHCi session:
Prelude> :set -package ndp package flags have changed, ressetting and loading new packages... Loading package ndp-1.0 ... linking ... done. Prelude> :l /home/chak/code/haskell/DotP_ndp [1 of 1] Compiling DotP_ndp ( /home/chak/code/haskell/DotP_ndp.hs, interpreted ) Ok, modules loaded: DotP_ndp. *DotP_ndp> dotp (toU [1..3]) (toU [4..6]) Loading package haskell98 ... linking ... done. 32.0 *DotP_ndp>
The difference between the package ndp and the -fparr version of the dot product is just a fairly small amount of sugar. However, for programs using arrays of more complex (including nested arrays), the difference is much bigger. Nevertheless, many programs can be implemented quite easily with just package ndp. The speed difference between the two options is dramatic.
Most of the functions under Data.Array.Parallel.Unlifted are still purely sequential, albeit much more efficient than GHC.PArr. In addition, the (currently only few) functions from Data.Array.Parallel.Unlifted.Parallel transparently use multiple processing elements if GHC was compiled with SMP multiprocessor support.
A number of examples of using package ndp are in the examples directory.