对并行策略和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),不是吗?那个
parMap rpar
是多余的,因为它为每个可遍历的元素生成两个 Spark 。 !! 最佳答案
快速冒烟测试显示,是的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的评估。关于haskell - 并行parMap和策略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15193283/