haskell - 为什么以下内容会并行运行而不是顺序运行?

标签 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)

自从西蒙·马洛说了以下内容后,我就感到怀疑

To break down what happens when this Strategy is applied to a pair: parPair calls evalPair, and evalPair calls rparWith rdeepseq on each component of the pair. So the effect is that each component will be fully evaluated to normal form in parallel.

根据我所看到的 rparWith rdeepseq 是非正式的 rpar 。 rseq。 force 意味着参数将被评估为正常形式,它将按顺序使用 rseq 进行评估,因此最终 rpar 没有用处在并行上下文中。

所有内容均取自西蒙·马洛的书。


提前致谢。

最佳答案

让我们看一下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 至关重要,因为它引发了使用给定策略进行评估的争论。

关于haskell - 为什么以下内容会并行运行而不是顺序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41854791/

相关文章:

perl - 从 GNU 并行获取退出状态值

php - 在后台线程/进程中调用函数( fork )

r - R中doMC和doParallel的区别

haskell - 使用 Haskell 下载维基百科标记

haskell - 在 Haskell 中避免显式递归

java - 组Java开发

cuda - 为什么在将最大迭代次数设置为高于 5,500,000 时,此用于计算 Mandelbrot 集的 CUDA 代码会失败?

arrays - 使用数组在 haskell 中解析方案向量

函数构成 AND 函数应用

haskell - 杀死 Windows 上的 runhaskell 进程