这个问题在这里已经有了答案:
Why is there no implicit parallelism in Haskell?
(5 个回答)
7年前关闭。
在 haskell 中,假设我有以下形式的函数调用:foo a b
, 其中 a
不依赖于 b
反之亦然。似乎可以自动检测到 a
和 b
可以并行评估,但在 GHC 中似乎并非如此。而是像 par
这样的构造需要用来表示可以并行评估的内容。
那么,为什么haskell 中的并行化不能自动发生呢?或者如果它已经这样做了,为什么要像 par
这样的结构?存在?
最佳答案
It seems that it could be automatically detected that a and b can be evaluated in parallel
正如您所暗示的,通过查看值之间的依赖关系,可以自动检测并行性。当不涉及副作用时,这特别容易。
问题在于知道何时停止使事情并行。
这一切都归结为在编译时知道运行时会发生多少工作。这些“成本模型”通常很难用于任意代码。
考虑:
(+)
的每个参数都应该并行评估? 如果我们天真地并行化所有独立计算,编译器将生成大量并行任务。数百万或数十亿个并行表达式。我们的 8 或 16 核机器还没有准备好处理。
幼稚的并行化会导致大量开销试图将工作安排到少量可用的并行硬件上。
纯程序中的并行量与可用硬件之间的差距迫使我们做出一些妥协。即:
并行
第一种形式的例子——用户提示——are
par
annotations或 Par
单子(monad)。第二种——自动并行子语言——见Data Parallel Haskell .
关于haskell - Haskell 中的自动并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26084591/