为什么以下并行运行而不是顺序运行?

时间:2017-01-25 14:59:57

标签: haskell parallel-processing

分别为evalPairparPairdeepSeq提供以下功能

evalPair :: Strategy a -> Strategy b -> Strategy (a,b)
evalPair sa sb (a,b) = do
      a' <- sa a
      b' <- sb b
      return (a',b')

parPair :: Strategy a -> Strategy b -> Strategy (a,b)
parPair sa sb = evalPair (rparWith sa) (rparWith sb)

rdeepseq :: NFData a => Strategy a
rdeepseq x = rseq (force x)

问题是为什么以下代码会按照作者的要求并行评估?

parPair rdeepseq rdeepseq :: (NFData a, NFData b) => Strategy (a,b)

我很自从Simon Marlow说以下

  

要分解将Strategy应用于一对时发生的情况:   parPair调用evalPair,并在每个evalPair调用rparWith rdeepseq   这对组成部分。所以效果是每个组件都会   完全评估为正常形式。

根据我所看到的rparWith rdeepseq是非正式的rpar . rseq . force,这意味着参数将被评估为正常形式,它将依次用rseq进行评估,因此最终rpar在并行环境中没用。

一切都取自Simon Marlow的书。

提前致谢。

1 个答案:

答案 0 :(得分:4)

让我们看看parPair rdeepseq rdeepseq

parPair rdeepseq rdeepseq (a,b)
 = evalPair (rparWith rdeepseq) (rparWith rdeepseq) (a,b)
 = do
    a' <- rparWith rdeepseq a
    b' <- rparWith rdeepseq b
    return (a', b')

由于rparWith激发了它的参数,rdeepseq a将被并行评估(可能)。如果您使用

,它将不会并行
evalPair rdeepseq rdeepseq

代替。 rparWith是必不可少的,因为它激发了用给定策略进行评估的论据。