并行parMap和策略

12

这是关于并行策略和parMap(Control.Parallel.Strategies)的疑问。

它涉及到parMap rseqparMap 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 dot rseq) 等同于 (rseq dot rpar),是吗?

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

1个回答

5
一个快速的烟雾测试表明,是的parMap rseqparMap 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倍)要长得多,而且resultParresultSeq的时间相对来说是一样的。

关于GHC对Eval单子的实际解释缺乏更多细节,但鉴于 parMap strat f=withStrategy(parList strat).map f以及这个实验结果,我认为我可以自信地说列表中的每个元素都会被点火以评估到WHNF。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接