haskell - Haskell 中的自动并行

标签 haskell parallel-processing

这个问题在这里已经有了答案:





Why is there no implicit parallelism in Haskell?

(5 个回答)


7年前关闭。




在 haskell 中,假设我有以下形式的函数调用:foo a b , 其中 a不依赖于 b反之亦然。似乎可以自动检测到 ab可以并行评估,但在 GHC 中似乎并非如此。而是像 par 这样的构造需要用来表示可以并行评估的内容。

那么,为什么haskell 中的并行化不能自动发生呢?或者如果它已经这样做了,为什么要像 par 这样的结构?存在?

最佳答案

It seems that it could be automatically detected that a and b can be evaluated in parallel



正如您所暗示的,通过查看值之间的依赖关系,可以自动检测并行性。当不涉及副作用时,这特别容易。

问题在于知道何时停止使事情并行。

这一切都归结为在编译时知道运行时会发生多少工作。这些“成本模型”通常很难用于任意代码。

考虑:
  • (+) 的每个参数都应该并行评估?
  • 是否应该并行评估每张 map ?

  • 如果我们天真地并行化所有独立计算,编译器将生成大量并行任务。数百万或数十亿个并行表达式。我们的 8 或 16 核机器还没有准备好处理。

    幼稚的并行化会导致大量开销试图将工作安排到少量可用的并行硬件上。

    纯程序中的并行量与可用硬件之间的差距迫使我们做出一些妥协。即:
  • 用户注释的提示,哪些事情的成本足够高
    并行
  • 具有明确成本模型的语言子集,因此编译器可以很聪明。

  • 第一种形式的例子——用户提示——are par annotationsPar单子(monad)。
    第二种——自动并行子语言——见Data Parallel Haskell .

    关于haskell - Haskell 中的自动并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26084591/

    相关文章:

    cuda - 使用 CUDA 并行实现多个 SVD

    multithreading - 通过并行化提高循环性能

    haskell - haskell中多元函数的结果类型

    Haskell IO Monad 和内存使用

    haskell - wx 0.90.0.1 无法在 Haskell Platform 2012.2.0.0 (WinXP) 上安装

    performance - Scala快速生成上三角矩阵坐标

    debugging - 为什么在 GHC 中直接导入的函数与我使用从 GHC 库中复制的源代码编写的函数大不相同

    haskell - 封闭类型族中的约束

    windows - Windows XP 上 R 中的多核处理 - 通过 doMC 和 foreach

    r - 我可以嵌套 parallel:::parLapply() 吗?