haskell - 为什么 Haskell 中没有隐式并行性?

标签 haskell concurrency parallel-processing compiler-optimization

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/

相关文章:

Haskell FFI - C 结构数组数据字段

Haskell:为什么 GHC 不使用fundeps 推断这个类型类中的类型?

python - multiprocessing.Process 的日志输出

java - 如何保持线程执行直到异步线程返回回调

javascript - 异步并行请求按顺序运行

java - 具有惰性评估的复杂结构翻译

Haskell 的 Pairs 类型

java - 为什么 `h`这个参数在AbstractQueuedSynchronizer中会判断两次是否为null?

c# - 异步生产者/消费者

bash - 获取 sibling 的PID