Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

parallel parMap and strategies

Tags:

haskell

It's a doubt about parallel strategies and parMap (Control.Parallel.Strategies)

It's about parMap rseq equivalence with parMap rpar.

Since parMap uses parList it evaluates in parallel so using either rseq or rpar will evaluate in parallel to WHNF. Isn't it ?

Update:

Since

parMap strat f = (`using` parList strat) . map f

parList = parTraversable

parTraversable strat = evalTraversable (rpar `dot` strat)

evalTraversable = traverse

strat2 `dot` strat1 = strat2 . runEval . strat1

parMap rseq uses the strategy

rpar `dot` rseq

which gives:

rpar . runEval . rseq

which gives:

(\x -> x `par` return x) . runEval . (\x -> x `pseq` return x)

It is hard to think about the result.


Update:

I see, the lazy evaluation takes the first function of the composition first, and

(\x -> x `par` return x)

grants that every element in the traversable container will be sparked for a parallel computation when possible.

So we could add that (rpar dot rseq) is equivalent to (rseq dot rpar), isn't it?

And that parMap rpar is redundant in that it generates two sparks for every traversable element. !!

like image 373
Gabriel Riba Avatar asked Mar 04 '13 01:03

Gabriel Riba


1 Answers

A quick smoke test reveals that yes parMap rseq and parMap rpar both get evaluated in parallel.

import Control.Parallel.Strategies

fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = print resultPlain where
  resultPlain = [fib 34, fib 34, fib 34, fib 34]
  resultPar   = parMap rpar id [fib 34, fib 34, fib 34, fib 34]
  resultSeq   = parMap rseq id [fib 34, fib 34, fib 34, fib 34]

and then, using each kind of result_____ I timed the compiled binaries

ghc -threaded --make rpar
time ./rpar +RTS -N4

and saw that resultPlain was much longer than resultPar or resultSeq (about 2x longer) and resultPar and resultSeq were comparatively identically timed.

More details into GHC's actual interpretation of the Eval monad are lacking, but given that parMap strat f = withStrategy (parList strat) . map f along with the results of this experiment I feel confident saying each element in the list is sparked for evaluation to WHNF.

like image 188
J. Abrahamson Avatar answered Nov 16 '22 01:11

J. Abrahamson