多核并行处理和堆栈运行的runghc

8
我曾经在一个脚本上工作,希望通过使用Async.mapConcurrently替换mapM来利用我的机器中的多个处理器。
在那种情况下没有观察到速度的提升,我想验证runghc确实可以利用多个核心。
给定一个文件Foo.hs:
import Control.Concurrent

main = print =<< Control.Concurrent.getNumCapabilities

如果我按照以下方式编译文件:
stack ghc -- -threaded Foo.hs

然后按以下方式运行它:
./Foo

它返回结果1。这是预期的,因为没有提供 RTS 选项。改为按以下方式运行:

./Foo +RTS -N

返回数字6,因为我的计算机有6个处理器(与nproc相符)。

然而,当我以“解释模式”运行脚本时,情况就不同了:

GHCRTS="-N" stack runghc Foo.hs

它会产生以下错误文本:
Running /home/kostmo/.stack/programs/x86_64-linux/ghc-nopie-8.0.2/bin/ghc-pkg --no-user-package-db list --global exited with ExitFailure 1

ghc-pkg: the flag -N requires the program to be built with -threaded

是否可以使用多个核心来运行堆栈“脚本”?

1个回答

6
感谢您提出这个问题,我认为stack应该特别处理GHCRTS环境变量,并打开了这个问题https://github.com/commercialhaskell/stack/issues/3444并进行了这个更改https://github.com/commercialhaskell/stack/pull/3445 不幸的是,它不能解决这种情况,因为runghc本身(ghc)将处理GHCRTS,并且它没有使用线程运行时构建。因此,无法使用环境变量解决方案。
我认为可以向stack脚本--compile提供-with-rtsopts -N标志,但似乎不起作用,需要进一步调查。这对于runghc不起作用,因为它使用解释器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接