Primitive parallelism and the Runtime System
In Haskell, parallel execution (of pure values) boils down to evaluating thunks into WHNF simultaneously. The GHC primitive we can use to annotate parallelism is called par
, exported from the Control.Parallel
module in the parallel
package:
par :: a → b → b
Note that par has exactly the same type as seq
, which is used to control strictness. So whereas a `seq` b
ensures that a
is evaluated when b
is evaluated, a `par` b
evaluates a
in parallel with b
.
Let's start with a simple example. Everyone's favorite naive Fibonacci function appears again. This time, however, we will be calculating multiple Fibonacci numbers simultaneously. The following program prints Fibonacci numbers between 37 and 40:
-- file: fib.hs fib :: Int -> Int fib n | n <= 1 = 1 | otherwise = let a = fib (n - 1) b = fib (n - 2) in a + b main = print $ let x = fib 37 y = fib 38 z = fib 39 w = fib 40 in (x,y...