我一直在研究script,希望通过将mapM
与 Async.mapConcurrently
换出来利用机器中的多个处理器。
在那种情况下,没有观察到速度的提高,我想验证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
有可能利用带有堆栈“脚本”的多个内核吗?
最佳答案
感谢您提出这个问题,我认为堆栈应该专门处理GHCRTS环境变量,并打开https://github.com/commercialhaskell/stack/issues/3444这个问题并进行了https://github.com/commercialhaskell/stack/pull/3445的更改
不幸的是,它不能解决这种情况,因为runghc
本身(ghc)将处理GHCRTS
,并且它不是使用线程化的运行时构建的。因此,无法使用环境变量解决方案。
我认为应该可以向-with-rtsopts -N
提供stack script --compile
标志,但这似乎不起作用,需要进一步调查。这不适用于runghc
,因为它使用了解释器。