繁体   English   中英

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

[英]How to take F# measurements to get speedups

假设一台机器有8个核心。 在Haskell中,你可以编译使用threaded选项,然后运行使用过程中+RTS -Nx指定要使用的核心数量。 例如

$ 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,例如MaxDegreeOfParallelism 可能是我需要但不确定它的确切行为,我必须以编程方式使用它,只要它的行为与预期一样好,即MaxDegreeOfParallelism =核心程序的数量应该使用,而不是并行的“任务”或线程。

编辑: ProcessorAffinity确实限制了使用的核心数量,但似乎它没有在Mono中正确实现。 我检查了Windows,它似乎工作。 虽然使用它并不是一个好主意。 运行时系统应该能够更好地决定如何管理和安排任务。 此外, MaxDegreeOfParallelism是关于“并行度”,它基本上设置了生成的任务数,因此可用于改变粒度。

引用bytebuster的评论:

F#构建了一个本机.NET程序集。 程序集遵循为运行时指定的规则(CLR),默认情况下,它对所有CPU核心具有亲和性。 通过设置System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity可以将CLR限制为更少的核心数。

(如果你添加一个答案留下评论,我会删除这个)

F#构建了一个本机.NET程序集。 程序集遵循为运行时指定的规则(CLR),默认情况下,它对所有CPU核心具有亲和性。 通过设置System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity可以将CLR限制为更少的核心数。

对于Mono环境,这个答案似乎不完整。 ProcessorAffinity是位掩码 ,因此0肯定是无效条件。 我也想知道为什么setter没有抛出MSDN中描述的异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM