目录

上一个主题

7.3. 优化(代码改进)

下一个主题

7.6条。标志引用

本页

7.4. 使用Concurrent Haskell

GHC默认支持Concurrent Haskell,不需要特殊选项或以某种方式编译的库。要访问Concurrent Haskell的支持库,只需导入控制。同时发生的。有关Concurrent Haskell的更多信息是在该模块的文档中提供。

也可以选择将程序链接到-有螺纹的选项(请参见影响链接的选项。这有两个好处:

  • 它使-N个 ⟨x⟩允许线程在中运行多处理器或多核机器上的并行性。请参见使用SMP并行.
  • 如果线程进行外部调用(并且调用未标记不安全的),则程序中的其他Haskell线程将继续在进行外呼时运行。此外,外国的 出口ed Haskell函数可以从多个OS线程同时执行。请参见多线程和FFI.

以下RTS选项影响Concurrent Haskell的行为程序:

-C类⟨s⟩
默认值:20毫秒

将上下文切换间隔设置为秒。之后的下一个堆块分配中将发生上下文切换计时器过期(堆块分配每4k发生一次分配)。使用-二氧化碳-C类,上下文切换将作为尽可能经常(在每次堆块分配时)。

7.5. 使用SMP并行

GHC支持在SMP上并行运行Haskell程序(对称多处理器)。

两者之间有很好的区别并发平行度:并行性就是让程序运行更快通过使用同时使用多个处理器。另一方面,同时,是一种抽象方法:它是构造程序的一种方便方法必须响应多个异步事件。

然而,这两个术语肯定是相关的。通过利用多重CPU可以并行运行并发线程,这是GHC的SMP并行性支持的功能。但这也是可能的在执行以下操作的程序上通过并行实现性能改进不使用并发。本节介绍如何使用GHC进行编译并运行并行程序,在并发和并行Haskell我们描述了影响并行性的语言特征。

7.5.1. SMP并行的编译时选项

为了使用多个CPU,您的程序必须与这个-有螺纹的选项(请参见影响链接的选项). 此外以下编译器选项会影响并行性:

-饱餐一顿

Blackholing是将thunk(惰性计算)标记为正在接受评估。它之所以有用有三个原因:首先让我们检测某些类型的无限循环(不终止例外),其次,它避免了某些类型的空间泄漏,第三,它避免了在并行程序,因为我们可以知道什么时候计算已经完成了正在进行中。

选项-饱餐一顿使每一声沉闷评估一开始就进入黑洞。默认值为“懒惰blackholing”,即thunks只被标记为处于线程因某种原因暂停时的求值。懒散的打黑通常效率更高(1-2%左右),因为大多数笨蛋不需要被黑洞包围。然而,急于进入黑洞可以避免并行程序中的重复计算次数较多事实证明,这对并行性很重要。

我们建议编译任何要在中运行的代码与…平行-饱餐一顿标志。

7.5.2. SMP并行性的RTS选项

有两种方法可以在多个处理器上运行程序:调用控制。Concurrent.setNum功能来自您的程序,或使用RTS-N个 ⟨x⟩选项。

-N个⟨x⟩
-最大N⟨x⟩

在运行程序时使用⟨x⟩并发线程。

运行时管理一组虚拟处理器,我们称之为能力,其数量由-N个选项。每个功能一次可以运行一个Haskell线程,因此功能的数量等于Haskell线程的数量可以在物理上并行运行。功能由一个或更多操作系统线程;运行时管理的操作系统线程池每个功能,因此如果Haskell线程进行外部调用(请参见多线程和FFI)另一个操作系统线程可以接管它能力。

通常应选择“x”以匹配上的CPU内核数机器[1]例如,在双核机器上,我们会可能使用+RTS系统 -氮气 -RTS系统.

省略⟨x⟩,即。+RTS系统 -N个 -RTS系统,让运行时选择⟨x⟩本身的值取决于您的处理器数量机器。

使用-最大N x,即。+RTS系统 -最大N3 -RTS系统,运行时将选择最多(x),也受到系统上处理器数量的限制。如果需要默认使用选项,则省略(x)是一个错误-N个.

使用机器中的所有处理器时要小心:如果您的处理器正被其他程序使用,这实际上会造成危害要求GHC创造更多能力物理线程几乎总是一个坏主意。

设置-N个还具有启用并行垃圾的效果收集器(请参见控制垃圾收集器的RTS选项).

的当前值-N个选项对Haskell可用程序通过控制。并发.getNumCapabilities,可能是在程序运行时通过调用更改控制。并发setNumCapabilities.

以下选项会影响运行时调度线程的方式CPU:

-质量保证

使用操作系统的关联工具尝试将操作系统线程固定到CPU核心。

启用此选项后,操作系统将执行功能线程\(i)绑定到CPU内核\(i)使用操作系统提供的API进行设置线程关联。例如,在Linux上GHC使用sched_setaffinity().

根据您的工作量和机器上的其他活动,这可能会导致性能改进,也可能不会。我们建议尝试一下并测量差异。

-质量管理

禁用自动迁移以实现负载平衡。通常为运行时将自动尝试跨可用CPU调度线程利用空闲CPU;此选项禁用该行为。注释这种迁移只适用于线程;火花产生于标准通过工作密封单独进行负载平衡。

此选项可能仅用于那些使用显式调度CPU上的线程控制。Concurrent.fork开启.

7.5.3. 使用SMP并行性的提示

添加-秒 [文件]运行程序时的RTS选项计时统计,这将有助于告诉您您的程序是否在是否使用更多CPU。如果用户时间大于已用时间,则该程序使用了一个以上的CPU。您还应该在没有-N个 ⟨x⟩用于比较。

的输出+RTS系统 -秒告诉你创造了多少“火花”在程序运行期间执行(请参见控制垃圾收集器的RTS选项),这会让你知道你的标准注释为工作。

由于以下原因,GHC在6.12.1中的并行支持得到了改进在运行时系统中进行实验和调优。我们还是会很想知道它对您的效果如何,我们也很感兴趣收集并行程序以添加到基准测试套件中。

[1]是否应对超线程核心进行计数是一个开放的问题问题;请随意实验,让我们知道你的结果找到。