并行parMap和策略

Gab*_*iba 9 haskell

对并行策略和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
Run Code Online (Sandbox Code Playgroud)

parMap rseq 使用策略

rpar `dot` rseq
Run Code Online (Sandbox Code Playgroud)

这使:

rpar . runEval . rseq
Run Code Online (Sandbox Code Playgroud)

这使:

(\x -> x `par` return x) . runEval . (\x -> x `pseq` return x)
Run Code Online (Sandbox Code Playgroud)

很难想到结果.


更新:

我看,懒惰的评估首先采用了合成的第一个功能,并且

(\x -> x `par` return x)
Run Code Online (Sandbox Code Playgroud)

授予可移动容器中的每个元素在可能的情况下将被激发以进行并行计算.

所以我们可以补充一点(rpar dotrseq)相当于(rseq dotrpar),不是吗?

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

J. *_*son 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]
Run Code Online (Sandbox Code Playgroud)

然后,使用每种类型result_____对编译的二进制文件进行计时

ghc -threaded --make rpar
time ./rpar +RTS -N4
Run Code Online (Sandbox Code Playgroud)

并看到比或resultPlain长得多(大约长 2 倍)并且和的时间相对相同。resultParresultSeqresultParresultSeq

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