假设单机有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# 中执行此操作在代码中使用并行映射?
EDIT:我发现有并行选项 http://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism.aspx e.g. MaxDegreeOfParallelism
which may是我需要的,但不确定它的确切行为,我必须以编程方式使用它,只要它的行为符合预期即可,即MaxDegreeOfParallelism
= 程序应使用的核心数,而不是并行“任务”或线程数。
EDIT:
ProcessorAffinity
确实限制了要使用的核心数量,但似乎它在 Mono 中没有正确实现。我在 Windows 上检查过,它似乎可以工作。尽管使用它并不是一个好主意。运行时系统应该能够更好地决定如何管理和调度任务。还,MaxDegreeOfParallelism
是关于“并行级别”,它基本上设置生成的任务数量,因此可用于改变粒度。
F# 构建本机 .NET 程序集。程序集遵循为运行时 (CLR) 指定的规则,默认情况下,该规则在所有 CPU 内核上具有关联性。您可以限制 CLRfewer通过设置核心数System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity
.
对于 Mono 环境,这个答案似乎不完整。ProcessorAffinity
value 是一个位掩码 http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.processoraffinity.aspx, so 0
肯定是一个无效条件。我还想知道为什么 setter 没有按照 MSDN 中的描述抛出异常。
我会用schedutils
检查 Mono 亲和力并检查是否MONO_NO_SMP
未设置环境标志。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)