= Repa (REgular PArallel arrays) = Repa provides high performance, regular, multi-dimensional, shape polymorphic parallel arrays. All numeric data is stored unboxed. Functions written with the Repa combinators are automatically parallel provided you supply +RTS -Nwhatever on the command line when running the program. Repa means "turnip" in Russian. If you don't like turnips then this library probably isn't for you. == Download == Repa is split up into a few packages to help control dependencies. || [http://hackage.haskell.org/package/repa repa] || The base library, defining the array type and combinators. || || [http://hackage.haskell.org/package/repa-bytestring repa-bytestring] || Conversions to and from !ByteString. || || [http://hackage.haskell.org/package/repa-io repa-io] || Reading and writing arrays in various formats, including BMP. || || [http://hackage.haskell.org/package/repa-algorithms repa-algorithms] || Some reusable matrix algorithms. || || [http://hackage.haskell.org/package/repa-devil repa-devil] || Bindings to the DevIL image library. || || [http://hackage.haskell.org/package/repa-examples repa-examples] || Example applications. || If you want the lot then just install the examples, and this will pull down the rest. {{{ cabal install repa-examples }}} == From the source repo == The darcs source repos are at [http://code.ouroborus.net/repa/] == Frequently Asked Questions (FAQ) == Q: GHC complains: `ghc.exe: could not execute opt` what's up with that? [[br]] A: `opt` is the LLVM optimiser. You need to install [http://llvm.org/ LLVM]. Q: Where do I ask further questions? [[br]] A: Ask on [http://stackoverflow.com/search?q=repa Stack Overflow], or send a message to `repa@ouroborus.net` if that doesn't help. == Report a bug == To report bugs, request features, or get an account on the trac, please send email to `repa@ouroborus.net` == Papers and Tutorials == [http://www.cse.unsw.edu.au/~benl/papers/repa/repa-icfp2010.pdf Regular Shape Polymorphic Arrays in Haskell] * Describes the overall approach to fusion, and how the shape polymorphism works. * Since this paper was published, the internals have changed slightly, but the overall structure is the same. [http://www.cse.unsw.edu.au/~benl/papers/stencil/stencil-icfp2011-sub.pdf Efficient Parallel Stencil Convolution in Haskell] * Describes the current array representation. * Discusses the back-end, how the parallelism works, and how to write fast code. * Describes Repa's special support for Stencil convolutions. [http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Repa_Tutorial Tutorial on usage and optimisation] * Contains lots of simple examples to get you started. * High level discussion of fusion, optimisation, and how to use the {{{force}}} function. == Examples == Here is the output of some of the examples included in the [http://hackage.haskell.org/package/repa-examples repa-examples] package: || fft2d-highpass || Laplace || || [[Image(WikiStart:lena-high2-thumb.jpg)]] || [[Image(WikiStart:pls-400x400-out-thumb.jpg)]] || || [wiki:Examples/Fft2dHighpass more info] || [wiki:Examples/Laplace more info] || == Demo == There is also an OSX demo that does edge detection on a video stream: || [[Image(WikiStart:beholder-thumb.jpg)]] || || video: [http://code.ouroborus.net/beholder/video/Edge480.mov low(10MB)] [http://code.ouroborus.net/beholder/video/Edge720.mov high(40MB)] || * The [http://code.ouroborus.net/beholder/beholder-head/ source] should compile with XCode 3.2.1, GHC 7.0.3 and Repa 2.0.0, but you need to update and run the CONFIGURE.sh script to point it to your GHC install. * There are also prebuilt OSX i386 versions for [http://code.ouroborus.net/beholder/distro/beholder-N2.tgz two] [http://code.ouroborus.net/beholder/distro/beholder-N4.tgz four] and [http://code.ouroborus.net/beholder/distro/beholder-N6.tgz six] threads. These just have the corresponding +RTS -N# option baked in, you can set it in the main.m module. Some day I will make it so you can select this from the GUI. * You can also run the edge detector over a single uncompressed .bmp file using the repa-canny program from the [http://hackage.haskell.org/package/repa-examples repa-examples] package.