对并行策略和parMap
(Control.Parallel.Strategies)存在疑问
大约parMap rseq
等同于parMap rpar
。
由于parMap
使用parList
,因此它会并行评估,因此使用rseq
或rpar
将与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
是多余的,因为它为每个可遍历的元素生成两个火花。 !!
答案 0 :(得分:4)
快速烟雾测试显示,parMap rseq
和parMap 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
并且发现resultPlain
比resultPar
或resultSeq
(大约长2倍)长得多,resultPar
和resultSeq
的时间相对时间相同。
有关GHC对Eval
monad的实际解释的更多细节缺乏,但考虑到parMap strat f = withStrategy (parList strat) . map f
以及此实验的结果,我有信心说列表中的每个元素都被激发用于评估WHNF