12

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 dotrseq)等价于(rseq dotrpar),不是吗?

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

4

1 回答 1

5

快速冒烟测试表明是的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

并且看到resultPlainresultParresultSeq(大约长 2 倍)长得多,resultPar并且resultSeq时间相对相同。

Eval缺乏 GHC 对 monad的实际解释的更多细节,但考虑到parMap strat f = withStrategy (parList strat) . map f这个实验的结果,我有信心说列表中的每个元素都是为了评估 WHNF 而引发的。

于 2013-03-04T06:11:58.537 回答