假设一台机器有8个核心。
在Haskell中,您可以使用threaded
选项进行编译,然后在运行时使用+RTS -Nx
来指定要使用的核心数。 e.g。
$ myprg args // sequential run
$ myprg args +RTS -N1 // parallel run on 1..8 cores
$ myprg args +RTS -N2
$ myprg args +RTS -N4
$ myprg args +RTS -N8
通过这种方式,您可以使用越来越多的内核获得运行时,然后您可以使用这些内核来获得加速并绘制图表。
如果我有一个并行程序,你将如何在F#中执行此操作在代码中使用并行映射?
编辑: 我发现有ParallelOptions例如{em>可能
=程序应该使用的核心数,而不是并行的“任务”或线程。
修改
MaxDegreeOfParallelism
确实限制了要使用的核心数量,但似乎没有在Mono中正确实现。我检查了Windows,它似乎工作。虽然使用它并不是一个好主意。运行时系统应该能够更好地决定如何管理和安排任务。此外,MaxDegreeOfParallelism
是关于“并行度”,它基本上设置了生成的任务数,因此可用于改变粒度。
答案 0 :(得分:2)
引用bytebuster的评论:
F#构建本机.NET程序集。程序集遵循为运行时指定的规则(CLR),默认情况下,它对所有CPU核心具有亲和性。您可以通过设置System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity
来限制CLR以减少核心数量。
(如果你添加一个答案留下评论,我会删除它)
答案 1 :(得分:2)
F#构建本机.NET程序集。程序集遵循为运行时指定的规则(CLR),默认情况下,它对所有CPU核心具有亲和性。您可以通过设置System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity
来限制更少个核心的CLR。
对于Mono环境,这个答案似乎不完整。 ProcessorAffinity
值is a bit mask,因此0
肯定是无效条件。我也想知道为什么setter没有抛出MSDN中描述的异常。
我会使用schedutils
检查Mono亲和力,并检查是否未设置MONO_NO_SMP
环境标志。