【问题标题】:How to take F# measurements to get speedups如何进行 F# 测量以获得加速
【发布时间】: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


【解决方案1】:

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

对于 Mono 环境,此答案似乎不完整。 ProcessorAffinityis a bit mask,所以0 肯定是一个无效条件。我也想知道为什么 setter 没有按照 MSDN 中的描述抛出异常。

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

【讨论】:

    【解决方案2】:

    引用 bytebuster 的评论:

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

    (如果您添加答案留下评论,我将删除此)

    【讨论】:

    • 您可能应该将答案标记为社区 wiki(如果您不是原作者)。
    • 我尝试使用ProcessorAffinity,但在具有 8 个内核的机器上运行并行程序时似乎没有任何区别。我希望将亲和力设置为 1、2、4、8 会增加加速,但事实并非如此。运行时保持不变,好像设置此属性没有任何区别。为什么会发生这种情况?在查看 msdn 中的文档后,我倾向于认为它适用于物理处理器而不是处理器内核。
    • @vis:默认情况下,任何标准并行库都会尝试使用您的所有内核。 ProcessorAffinityMaxDegreeOfParallelism 通常用于不希望击中所有内核的情况。如果您在使用ProcessorAffinity 仅打开一个处理器后具有相同的运行时,那么您的代码中可能存在导致其无法正确并行化的错误。例如,一个巨大的交易就是你的并行调用的确切位置。例如,如果您正在执行一个简单的映射,但在它之前执行一个复杂的操作。
    • 在更改之前和之后打印ProcessorAffinity,显示0。我不知道为什么会这样。 Process.GetCurrentProcess().ProcessorAffinity <- nativeint 2。我在 1 个处理器芯片上运行 8 核机器。
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2014-11-25
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多