【发布时间】:2012-03-13 04:14:38
【问题描述】:
假设一台机器有 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 是关于“并行级别”的,它基本上设置了生成的任务数量,因此可以用来改变粒度。
【问题讨论】:
-
如果您使用的是 Windows,您可以在任务管理器中设置 CPU 数量:addictivetips.com/windows-tips/…
-
我使用的是 Linux/mono。有没有办法在 Linux 下做同样的事情?
-
F# 构建本机 .NET 程序集。程序集遵循为运行时 (CLR) 指定的规则,默认情况下,这些规则在所有 CPU 内核上都具有关联性。您可以通过设置
System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity将 CLR 限制为 更少 个内核。 -
@bytebuster 你应该把它作为一个答案,这样我们就可以投票了——这是一个很好的问题答案。
标签: haskell f# parallel-processing measurement