并行parMap和策略

时间:2013-03-04 01:44:32

标签: haskell

对并行策略和parMap(Control.Parallel.Strategies)存在疑问

大约parMap rseq等同于parMap rpar

由于parMap使用parList,因此它会并行评估,因此使用rseqrpar将与WHNF并行评估。不是吗?

更新

由于

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使用策略

rpar `dot` rseq

给出:

rpar . runEval . rseq

给出:

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

很难想到结果。


更新

我知道,延迟评估首先采用合成的第一个函数,然后

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

允许可行的容器中的每个元素都被激发,以便在可能的情况下进行并行计算。

所以我们可以补充一点(rpar dot rseq)相当于(rseq dot rpar),不是吗?< / p>

并且parMap rpar是多余的,因为它为每个可遍历的元素生成两个火花。 !!

1 个答案:

答案 0 :(得分:4)

快速烟雾测试显示,parMap rseqparMap rpar都会同时进行评估。

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]

然后,使用每种result_____我定时编译的二进制文件

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

并且发现resultPlainresultParresultSeq(大约长2倍)长得多,resultParresultSeq的时间相对时间相同。

有关GHC对Eval monad的实际解释的更多细节缺乏,但考虑到parMap strat f = withStrategy (parList strat) . map f以及此实验的结果,我有信心说列表中的每个元素都被激发用于评估WHNF