我对“火花”的概念感到困惑
它是 Haskell 中的一个线程吗?或者是产生一个新线程的动作?
谢谢大家:
总而言之,火花不是线程,而是更多的计算单元(用 C#/Java 术语表示的任务)。所以这是实现任务并行的 Haskell 方式。
我对“火花”的概念感到困惑
它是 Haskell 中的一个线程吗?或者是产生一个新线程的动作?
谢谢大家:
总而言之,火花不是线程,而是更多的计算单元(用 C#/Java 术语表示的任务)。所以这是实现任务并行的 Haskell 方式。
火花不是线程。forkIO
引入 Haskell 线程(映射到更少的真实操作系统线程)。Sparks 在每个线程的工作队列中创建条目,如果线程空闲,它们将从这些条目中执行任务。
因此,火花非常便宜(您可能在一个程序中有数十亿个火花,而您可能不会有超过一百万个 Haskell 线程,并且在六个核心上只有不到十几个操作系统线程)。
可以这样想:
请参阅Glasgow Parallel Haskell 的简要介绍。
并行性是由
par
组合器在 GPH 中引入的,它采用两个要并行计算的参数。表达式p `par` e
(这里我们使用 Haskell 的中缀运算符符号)与 具有相同的值e
,并且在其第一个参数中不严格,即bottom `par` e
具有 的值e
。(bottom
表示非终止或失败的计算。)它的动态行为是指示p
可以由新的并行线程评估,而父线程继续评估e
. 我们说它p
已经被触发,如果处理器空闲,随后可能会创建一个线程来评估它。由于线程不一定是创建的,p
类似于一个懒惰的未来。
【强调原文】
如果我理解正确,火花是需要工作的工作队列中的一个条目。一个线程池从这个队列中获取条目并运行它们。通常每个物理处理器有一个线程,因此该方案最大化吞吐量并最小化线程上下文切换。
看起来它类似于英特尔线程构建模块中的“任务”。