【问题标题】:What is overhead in term of parallel and concurrent programming (Haskell)?并行和并发编程(Haskell)的开销是多少?
【发布时间】:2017-07-12 06:52:10
【问题描述】:

并行和并发编程(Haskell)的开销是多少?

然而,即使是在纯函数式语言中,自动并行化也被一个古老的问题所阻碍:为了使程序更快,我们必须从并行性中获得更多的收益而不是由于开销而造成的损失添加它,编译时分析无法在这方面做出很好的判断。另一种方法是使用运行时分析来找到适合并行化的候选者并将此信息反馈给编译器。然而,即便如此,在实践中也不是非常成功。

(引自 Simon Marlow 的书Haskell 中的并行和并发编程

Haskell 中有哪些例子?

【问题讨论】:

  • 这本书其实详细阐述了很多,你都看完了吗?
  • 还没有,我会继续读下去。

标签: multithreading haskell concurrency parallel-processing


【解决方案1】:

在任何系统中,线程都会占用资源。您必须将该线程的状态存储在某处。创建线程并将其设置为运行需要时间。现在 GHC 使用轻量级的“绿色线程”,它比 OS 线程便宜得多。但它们仍然要花费一些

如果您要(例如)为每个加法、减法、乘法和除法生成一个新线程......那么,生成一个新线程的工作必须至少有几十个机器指令,而一个微不足道的算术运算可能是一条指令。将工作作为火花进行排队比生成一个全新线程所需的工作更少,但即便如此也不像在当前线程上执行操作那样便宜。

基本上,您要并行执行的工作的成本必须超过安排并行执行的成本。 (无论是启动一个 OS 线程还是一个绿色线程或排队一个 spark 等等。)GHC 有各种各样的东西来降低成本,但它仍然不是免费

【讨论】:

    【解决方案2】:

    您必须了解线程资源。他们不是免费来的。换句话说:当你创建一个线程(独立于语言)时,你必须进行系统调用,操作系统必须创建一个线程实例,等等。线程有状态——随着时间的推移而变化;所以某种线程管理会在后台发生。

    当然,当您的线程最终更多 超出底层硬件可以支持的 - 那么系统将不得不不时切换线程。当然,这并不像切换完整的进程那样昂贵,但这仍然意味着需要保存(或恢复)寄存器,您的硬件缓存可能会受到影响,等等。

    【讨论】:

    • GHC 的线程比 OS 线程便宜很多,但它们仍然使用一些内存(1KB?)并且有一点调度开销。
    • 那么不利的一面是,这些线程是否可以让我们使用底层硬件。
    • @GhostCat GHC 在少量真实操作系统线程上多路复用多个轻量级绿色线程。 (操作系统线程数默认为 CPU 内核数。)
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多