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

vis*_*vis 5 parallel-processing f# haskell measurement

假设一台机器有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
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以使用越来越多的内核获得运行时,然后您可以使用这些内核来获得加速并绘制图形.

如果我有一个并行程序,例如在代码中使用并行映射,你将如何在F#中执行此操作?

编辑: 我发现有ParallelOptions,例如MaxDegreeOfParallelism,这可能是我需要但不确定它的确切行为,我必须以编程方式使用它,只要它的行为符合预期,即MaxDegreeOfParallelism=核心程序应使用的数量,并且不是并行的'任务'或线程.

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

byt*_*ter 2

F# 构建本机 .NET 程序集。程序集遵循为运行时 (CLR) 指定的规则,默认情况下,该规则在所有 CPU 内核上具有关联性。您可以通过设置将 CLR 限制为较少数量的核心System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity

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

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