Haskell 并行parMap及其策略
这是对并行策略和Haskell 并行parMap及其策略,haskell,Haskell,这是对并行策略和parMap(Control.parallel.strategies)的怀疑 它是关于parMap-rseq与parMap-rpar的等价性 由于parMap使用parList进行并行计算,因此使用rseq或rpar将与WHNF并行计算。不是吗 更新: 自 parMap-rseq使用该策略 rpar `dot` rseq 其中: rpar . runEval . rseq (\x -> x `par` return x) . runEval . (\x -> x
parMap
(Control.parallel.strategies)的怀疑
它是关于parMap-rseq
与parMap-rpar
的等价性
由于parMap
使用parList
进行并行计算,因此使用rseq
或rpar
将与WHNF并行计算。不是吗
更新:
自
parMap-rseq
使用该策略
rpar `dot` rseq
其中:
rpar . runEval . rseq
(\x -> x `par` return x) . runEval . (\x -> x `pseq` return x)
其中:
rpar . runEval . rseq
(\x -> x `par` return x) . runEval . (\x -> x `pseq` return x)
很难想象结果
更新: 我明白了,惰性求值首先采用组合的第一个函数,然后
(\x -> x `par` return x)
允许在可能的情况下触发可遍历容器中的每个元素进行并行计算
所以我们可以加上(rpardot
rseq)等同于(rseqdot
rpar),不是吗
而且,
parMap rpar
是冗余的,因为它为每个可遍历元素生成两个火花 快速烟雾测试显示,yesparMap-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\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
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进行评估