51

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

它是 Haskell 中的一个线程吗?或者是产生一个新线程的动作?

谢谢大家:

总而言之,火花不是线程,而是更多的计算单元(用 C#/Java 术语表示的任务)。所以这是实现任务并行的 Haskell 方式。

4

4 回答 4

94

火花不是线程。forkIO引入 Haskell 线程(映射到更少的真实操作系统线程)。Sparks 在每个线程的工作队列中创建条目,如果线程空闲,它们将从这些条目中执行任务。

因此,火花非常便宜(您可能在一个程序中有数十亿个火花,而您可能不会有超过一百万个 Haskell 线程,并且在六个核心上只有不到十几个操作系统线程)。

可以这样想:

火花模型

于 2009-06-06T04:30:41.913 回答
32

请参阅Glasgow Parallel Haskell 的简要介绍。

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

【强调原文】

于 2009-06-05T22:46:52.147 回答
3

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

于 2009-06-06T19:49:41.657 回答
1

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

于 2009-12-16T20:03:50.650 回答