为什么必须同时使用编译器标志和运行时标志来获得Haskell中的多核支持?

Tim*_*rry 19 parallel-processing concurrency haskell multicore

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

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

  • 使用-threaded开关编译程序.
  • 例如,使用+ RTS -N2运行程序以使用2个线程.您应该使用-N值等于计算机上的CPU核心数(不包括超线程核心).


    让标志必须在编译时和运行时再次设置似乎有些繁琐.这些标志是否是为GHC增加并发性的遗留因素?

  • Tho*_*son 31

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

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

    ghc -threaded -rtsopts -with-rtsopts=-N
    
    Run Code Online (Sandbox Code Playgroud)

    这1)使用线程运行时系统2)启用RTS选项3)设置RTS选项以使用与可用核心一样多的线程(使用-Nx哪里x是一个数字来手动控制OS线程的数量).

    • 至少,有一个钩子.但这是一种指定默认RTS选项的丑陋方式. (2认同)
    • 编译器标志是一个非常好的补充. (2认同)

    Don*_*art 8

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

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

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

    • 我不这么认为.毕竟,如果我愿意的话,我可以将整个程序整合在一起.但我不想.我想用-threaded进行编译,通过在命令行上放置"+ RTS -N -RTS"来提供当前启用的行为.我认为这样会更清洁. (3认同)