Haskell 是函数式且纯粹的,因此基本上它具有编译器能够处理 implicit parallelism 所需的所有属性。 .
考虑这个简单的例子:
f = do
a <- Just 1
b <- Just $ Just 2
-- ^ The above line does not utilize an `a` variable, so it can be safely
-- executed in parallel with the preceding line
c <- b
-- ^ The above line references a `b` variable, so it can only be executed
-- sequentially after it
return (a, c)
-- On the exit from a monad scope we wait for all computations to finish and
-- gather the results
执行计划大致可以描述为:
do
|
+---------+---------+
| |
a <- Just 1 b <- Just $ Just 2
| |
| c <- b
| |
+---------+---------+
|
return (a, c)
为什么编译器中还没有通过标志或编译指示实现此类功能?实际原因是什么?
最佳答案
这是一个长期研究的话题。虽然您可以在 Haskell 代码中隐式导出并行性,但问题是对于当前硬件来说,并行性太多,粒度太细。
因此,您最终将精力花在簿记上,而不是更快地处理事情。
由于我们没有无限的并行硬件,所以这也取决于选择正确的粒度 太粗了,就会有空闲的处理器,太细了,就会有开销 将是 Not Acceptable 。
我们拥有的是更粗粒度的并行性( Spark ),适合生成数千或数百万个并行任务(因此不是在指令级别),它们映射到我们今天通常可用的少数核心。
请注意,对于某些子集(例如数组处理),存在具有严格成本模型的全自动并行化库。
有关背景信息,请参阅 Feedback Directed Implicit Parallelism ,他们引入了一种在任意 Haskell 程序中插入 par
的自动化方法。
关于haskell - 为什么 Haskell 中没有隐式并行性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005670/