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)
允许在可能的情况下触发可遍历容器中的每个元素进行并行计算

所以我们可以加上(rpar
dot
rseq)等同于(rseq
dot
rpar),不是吗


而且,
parMap rpar
是冗余的,因为它为每个可遍历元素生成两个火花

快速烟雾测试显示,yes
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\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进行评估