【问题标题】:Why do you have to use both a compiler flag and a run-time flag to get multicore-support in Haskell?为什么必须同时使用编译器标志和运行时标志才能在 Haskell 中获得多核支持?
【发布时间】:2011-04-11 21:23:21
【问题描述】:

Haskell wiki 显示您需要同时设置编译标志和运行时标志才能获得多核支持。为什么在编译时使用库不足以获得正确的行为?除非另有说明,否则为什么运行时可执行文件不能检测到它是用 -thread 编译的并使用系统上的所有内核?我认为默认打开这些会更好。然后可能会有标志来关闭或修改这些功能。

http://www.haskell.org/haskellwiki/GHC/Concurrency#Multicore_GHC 说:

  • 使用 -thread 开关编译程序。
  • 例如,使用 +RTS -N2 运行程序以使用 2 个线程。您应该使用与您机器上的 CPU 内核数相等的 -N 值(不包括超线程内核)。


    必须在编译时和运行时再次设置标志似乎有些繁重。这些标志是为 GHC 添加并发性的努力的残余吗?

  • 【问题讨论】:

      标签: haskell concurrency parallel-processing multicore


      【解决方案1】:

      当您正在开发程序时,额外的+RTS ... 应该没什么大不了的(尽管我承认当我第一次拿起 Haskell 时这让我感到很奇怪)。对于最终(交付的)二进制文件,您可以通过提供包含 char *ghc_rts_opts = "-N"; 的 C 文件将其与静态 RTS 选项 (GHC manual) 链接。

      编辑:更新 GHC 7.x 的这个问题,现在有一种方法可以在编译时指定 RTS 选项:

      ghc -threaded -rtsopts -with-rtsopts=-N
      

      这 1) 使用线程运行时系统 2) 启用 RTS 选项 3) 将 RTS 选项设置为使用与可用内核一样多的线程(使用 -Nx 其中x 是手动控制数量的数字操作系统线程数)。

      【讨论】:

      • 至少,有一个钩子。但是指定默认 RTS 选项的方式多么丑陋。
      • 编译器标志是一个很好的补充。
      • 我在被彻底烧毁后通过搜索找到了这个帖子。 Intel cpu 上的 Linux 将在同一个内核上调度两个 CPU 最密集的线程。去看看实验性的 -qa 运行时标志,或者(像我一样)在关闭超线程的情况下重新启动你的机器。此外,在 4 核、8 虚拟核 CPU 上,所有工具中有一半会报告 8 核而不是 4,这取决于 CPU 型号。如果您只是在编译时设置 -N,您是否相信 GHC 默认始终使用 4 个而不是 8 个内核?如果没有单独的编码和运行时调优阶段,则无法实现并行。
      【解决方案2】:

      为什么运行时可执行文件不能检测到它是用 -thread 编译的并使用系统上的所有内核,除非另有说明?

      这是一个有趣的功能请求!

      您可以在 GHC 功能跟踪器上请求它:http://hackage.haskell.org/trac/ghc/wiki/ReportABug

      【讨论】:

      • 将提交。谢谢提示。
      • 考虑到如果此错误请求被视为已关闭,您可以执行 TomMD 建议的操作?
      • 我不这么认为。毕竟,如果我愿意,我可以将整个程序组合在一起。但我不想。我想使用 -thread 进行编译,以通过在命令行上放置“+RTS -N -RTS”来提供当前启用的行为。我认为这样会更干净。
      • 我同意蒂姆的观点。虽然没有程序员应该因为有一个额外的头文件而过于拖延,但多一点润色在这里并没有什么坏处。
      • 所以我提交了它,它被关闭了。显然,让运行时变得不那么晦涩并不是编译器团队的首要任务。重新提交给运行时团队。期待不同的结果。 hackage.haskell.org/trac/ghc/ticket/4319
      【解决方案3】:

      来自 GHC 用户指南(版本 6.12.1):

      省略x,即+RTS -N -RTS,让运行时根据您机器中的处理器数量自行选择x 的值。

      我想除了作者对默认值应该是什么的看法之外,没有什么特别的理由不让它成为默认值。 (请注意,这也启用了并行 GC,这有时可能不是您希望的默认值。)

      【讨论】:

      • 感谢您指出这一点。它解决了我的问题的“核心数量”部分。那是一个开始。然而,我更沮丧的是必须设置标志来编译和运行我的代码。
      • 在您开发程序时,这应该没什么大不了的,对于最终(交付的)二进制文件,您可以通过带有char *ghc_rts_options = "-N";
      • @TomMD:这是一个有用的技巧。这将解决我目前正在解决的问题。如果您将其发布为解决方案,我会接受。我还计划按照 Don Steward 的建议提交功能请求。
      猜你喜欢
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      相关资源
      最近更新 更多