什么是Haskell的“火花”

时间:2009-06-05 22:33:18

标签: multithreading haskell parallel-processing multicore

我对“火花”的概念感到困惑

它是Haskell中的一个主题吗?或者是产生新线程的行为?

谢谢大家:

总而言之,spark不是线程,而是更多的计算单元(将它放在C#/ Java术语中的任务)。所以这是实现任务并行性的Haskell方式。

4 个答案:

答案 0 :(得分:91)

Sparks不是线程。 forkIO引入了Haskell线程(映射到较少的实际OS线程)。 Sparks在每个线程的工作队列中创建条目,如果线程空闲,它们将从中执行任务。

因此,火花很便宜(你可能在程序中有数十亿个,而你可能不会有超过一百万个Haskell线程,而且在六个核心上只有不到十几个OS线程)。 / p>

这样想:

spark model

答案 1 :(得分:32)

请参阅A Gentle Introduction to Glasgow Parallel Haskell.

  

par组合器在GPH中引入了并行性,它采用两个并行求值的参数。表达式p `par` e(这里我们使用Haskell的中缀运算符表示法)与e具有相同的值,并且在其第一个参数中不严格,即bottom `par` e的值为{{1} }。 (e表示非终止或失败的计算。)其动态行为是指示bottom可由新并行线程评估,父线程继续评估p。我们说e已被引发,并且随后可以创建一个线程来评估处理器是否处于空闲状态。由于不一定要创建线程,p类似于懒惰的未来

[原文强调]

答案 2 :(得分:3)

如果我理解正确,火花就是需要工作的工作队列中的一个条目。线程池从此队列中获取条目并运行它们。通常每个物理处理器有一个线程,因此该方案可以最大化吞吐量并最小化线程上下文切换。

答案 3 :(得分:0)

它看起来类似于英特尔线程构建模块中的“任务”。