Haskell中的自动并行性

时间:2014-09-28 11:51:42

标签: haskell parallel-processing

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

那么,为什么haskell中的并行化才会自动发生?或者如果它已经存在,为什么存在像par这样的结构?

1 个答案:

答案 0 :(得分:3)

  

似乎可以自动检测到a和b可以并行评估

通过查看值之间的依赖关系,可以自动检测并行性。当没有副作用时,这一点特别容易。

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

这一切都归结为在编译时知道运行时会发生多少工作。这些"成本模型"对于任意代码来说很难做到。

考虑:

  • 是否应同时评估(+)的每个参数?
  • 是否应该并行评估每个地图?

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

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

纯程序中的并行数量与可用硬件之间的差距迫使我们做出一些妥协。即:

  1. 用户注释提示哪些事情的成本足够高 平行
  2. 具有明确成本模型的语言子集,因此编译器可以是智能的。
  3. 第一个表单的示例 - 用户提示 - are par annotationsPar monad。 在第二种 - 自动并行的子语言中 - 见Data Parallel Haskell