Data.Array.Accelerate
defines an embedded language of array computations for high-performance computing in Haskell. Computations on multi-dimensional, regular arrays are expressed in the form of parameterised collective operations (such as maps, reductions, and permutations). These computations are online-compiled and executed on a range of architectures.
For more details, we have a few academic papers:
- Accelerating Haskell Array Codes with Multicore GPUs
- Optimising Purely Functional GPU Programs (slides)
- Embedding Foreign Code
- Type-safe Runtime Code Generation: Accelerate to LLVM (slides), (video)
- Streaming Irregular Arrays (video)
- Embedded Pattern Matching (slides, video)
and presentations:
- FHPNC 2019 Keynote: Functional High-Performance Computing
- Embedded Languages for High-Performance Computing in Haskell
- GPGPU Programming in Haskell with Accelerate (video) (workshop)
Chapter 6 of Simon Marlow's book Parallel and Concurrent Programming in Haskell contains a tutorial introduction to Accelerate.
Trevor's PhD thesis details the design and implementation of frontend optimisations and CUDA backend.
Table of Contents
As a simple example, consider the computation of a dot product of two vectors of single-precision floating-point numbers:
dotp :: Acc (Vector Float) -> Acc (Vector Float) -> Acc (Scalar Float)
dotp xs ys = fold (+) 0 (zipWith (*) xs ys)
Except for the type, this code is almost the same as the corresponding Haskell code on lists of floats. The types indicate that the computation may be online-compiled for performance; for example, using Data.Array.Accelerate.LLVM.PTX.run
it may be on-the-fly off-loaded to a GPU.
Package Accelerate is available from:
- Hackage: accelerate - install with
cabal install accelerate
- GitHub: tmcdonell/accelerate - get the source with
git clone https://github.com/tmcdonell/accelerate.git
To install the Haskell toolchain try GHCup.
The following add-ons are available as separate packages:
- accelerate-llvm-native: Backend targeting multicore CPUs
- accelerate-llvm-ptx: Backend targeting CUDA-enabled NVIDIA GPUs. Requires a GPU with compute capability 2.0 or greater (see the table on Wikipedia)
- accelerate-examples: Computational kernels and applications showcasing the use of Accelerate as well as a regression test suite (supporting function and performance testing)
- Conversion between various formats:
- accelerate-io: For copying data directly between raw pointers
- accelerate-io-array: Immutable arrays
- accelerate-io-bmp: Uncompressed BMP image files
- accelerate-io-bytestring: Compact, immutable binary data
- accelerate-io-cereal: Binary serialisation of arrays using cereal
- accelerate-io-JuicyPixels: Images in various pixel formats
- accelerate-io-repa: Another Haskell library for high-performance parallel arrays
- accelerate-io-serialise: Binary serialisation of arrays using serialise
- accelerate-io-vector: Efficient boxed and unboxed one-dimensional arrays
- accelerate-fft: Fast Fourier transform implementation, with FFI bindings to optimised implementations
- accelerate-blas: BLAS and LAPACK operations, with FFI bindings to optimised implementations
- accelerate-bignum: Fixed-width large integer arithmetic
- colour-accelerate: Colour representations in Accelerate (RGB, sRGB, HSV, and HSL)
- containers-accelerate: Hashing-based container types
- gloss-accelerate: Generate gloss pictures from Accelerate
- gloss-raster-accelerate: Parallel rendering of raster images and animations
- hashable-accelerate: A class for types which can be converted into a hash value
- lens-accelerate: Lens operators for Accelerate types
- linear-accelerate: Linear vector spaces in Accelerate
- mwc-random-accelerate: Generate Accelerate arrays filled with high quality pseudorandom numbers
- numeric-prelude-accelerate: Lifting the numeric-prelude to Accelerate
- wigner-ville-accelerate: Wigner-Ville time-frequency distribution.
Install them from Hackage with cabal install PACKAGENAME
.
- Haddock documentation is included and linked with the individual package releases on Hackage
- The idea behind the HOAS (higher-order abstract syntax) to de-Bruijn conversion used in the library is described separately
The [accelerate-examples][accelerate-examples] package provides a range of computational kernels and a few complete applications. To install these from Hackage, issue cabal install accelerate-examples
. The examples include:
- An implementation of canny edge detection
- An interactive mandelbrot set generator
- An N-body simulation of gravitational attraction between solid particles
- An implementation of the PageRank algorithm
- A simple ray-tracer
- A particle based simulation of stable fluid flows
- A cellular automata simulation
- A "password recovery" tool, for dictionary lookup of MD5 hashes
LULESH-accelerate is in implementation of the Livermore Unstructured Lagrangian Explicit Shock Hydrodynamics (LULESH) mini-app. LULESH represents a typical hydrodynamics code such as ALE3D, but is a highly simplified application, hard-coded to solve the Sedov blast problem on an unstructured hexahedron mesh.
Accelerate users have also built some substantial applications of their own. Please feel free to add your own examples!
- Jonathan Fraser, GPUVAC: An explicit advection magnetohydrodynamics simulation
- David van Balen, Sudokus: A sudoku solver
- Trevor L. McDonell, lol-accelerate: A backend to the Λ ○ λ (Lol) library for ring-based lattice cryptography
- Henning Thielemann, patch-image: Combine a collage of overlapping images
- apunktbau, bildpunkt: A ray-marching distance field renderer
- klarh, hasdy: Molecular dynamics in Haskell using Accelerate
- Alexandros Gremm used Accelerate as part of the 2014 CSCS summer school (code)
The Accelerate team (past and present) consists of:
- Manuel M T Chakravarty (@mchakravarty)
- Gabriele Keller (@gckeller)
- Trevor L. McDonell (@tmcdonell)
- Robert Clifton-Everest (@robeverest)
- Frederik M. Madsen (@fmma)
- Ryan R. Newton (@rrnewton)
- Joshua Meredith (@JoshMeredith)
- Ben Lever (@blever)
- Sean Seefried (@sseefried)
- Ivo Gabe de Wolff (@ivogabe)
- David van Balen (@dpvanbalen)
- Tom Smeding (@tomsmeding)
- Robbert van der Helm ([@robbert-vdh])
The architect and leader of the Accelerate project is Trevor L. McDonell trevor.mcdonell@gmail.com. Please feel free to reach out to me!
- Bug reports and issues tracking
- Questions and discussion
accelerate-haskell@googlegroups.com
mailing list (sign-up)
Here is a list of features that are currently missing:
- Preliminary API (parts of the API may still change in subsequent releases)
- Many more features... contact us!