Kri*_*itz 5 parallel-processing haskell
在haskell中,假设我有一个以下形式的函数调用:foo a b
,其中a
不依赖于b
,反之亦然。看起来它可以自动检测到a
并且b
可以并行评估,但在 GHC 中似乎并非如此。相反,需要使用像 need 这样的结构par
来表示可以并行评估的内容。
那么,为什么 Haskell 中的并行化不能自动发生呢?或者,如果已经存在,为什么还会par
存在这样的结构?
似乎可以自动检测到a和b可以并行计算
正如您所暗示的,通过查看值之间的依赖关系可以自动检测并行性。当不涉及副作用时,这尤其容易。
问题在于知道何时停止并行。
这一切都归结为在编译时了解运行时将发生多少工作。对于任意代码来说,这些“成本模型”通常很难实现。
考虑:
(+)
是否应该并行评估每个参数?如果我们天真地并行化所有独立计算,编译器将生成大量并行任务。数百万或数十亿个并行表达式。我们的 8 或 16 核机器还没有准备好处理这些问题。
单纯的并行化会导致大量的开销,试图将工作安排到少量可用的并行硬件上。
纯程序中的并行量与可用硬件之间的差距迫使我们做出一些妥协。即:
第一种形式的示例——用户提示——是par
注释或Par
monad。关于第二种——自动并行子语言——请参阅Data Parallel Haskell。