【问题标题】:Why will the following run in parallel rather than sequentially?为什么以下会并行而不是顺序运行?
【发布时间】:2017-01-25 23:41:46
【问题描述】:

分别给定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 调用evalPairevalPair 调用rparWith rdeepseq 对的组成部分。所以效果是每个组件都会 完全并行评估为范式。

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

一切都取自西蒙·马洛的书中。


提前致谢。

【问题讨论】:

    标签: haskell parallel-processing


    【解决方案1】:

    我们来看看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 是必不可少的,因为它引发了使用给定策略进行评估的争论。

    【讨论】:

    • 所以你的回答意味着我对策略组合的理解不正确(即 rparWith rdeepseq == rpar . rseq . force 基本上是不正确的)?顺便说一句,感谢您的回答。
    • @McGill: 不,这完全没问题(嗯,除了缺少dot,因为你不能用(.) 组合策略)但是(.) f g xf (g x),所以(rpar . rseq. force) xrpar (rseq (force x))。在其他编程语言中,我们必须评估force x 才能使用rseq。但由于 Haskell 并不严格,我们实际上并没有评估 rpar &lt;something&gt; 中的参数。相反,我们将&lt;something&gt; 交给rpar然后触发&lt;something&gt; 进行并行评估。
    猜你喜欢
    • 2018-11-06
    • 2021-01-27
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多