如何进行F#测量以获得加速

时间:2012-03-13 04:14:38

标签: haskell f# parallel-processing measurement

假设一台机器有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是关于“并行度”,它基本上设置了生成的任务数,因此可用于改变粒度。

2 个答案:

答案 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环境,这个答案似乎不完整。 ProcessorAffinityis a bit mask,因此0肯定是无效条件。我也想知道为什么setter没有抛出MSDN中描述的异常。

我会使用schedutils检查Mono亲和力,并检查是否未设置MONO_NO_SMP环境标志。