[英]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.