堆栈梯级的多核并行性

kos*_*tmo 6 parallel-processing haskell haskell-stack

我一直在编写一个脚本,我希望通过交换来mapM利用我机器中的多个处理器Async.mapConcurrently.

在该实例中没有观察到速度增加,我想验证runghc确实可以使用多个核心.

给定一个文件Foo.hs:

import Control.Concurrent

main = print =<< Control.Concurrent.getNumCapabilities
Run Code Online (Sandbox Code Playgroud)

如果我按如下方式编译文件:

stack ghc -- -threaded Foo.hs
Run Code Online (Sandbox Code Playgroud)

然后运行如下:

./Foo
Run Code Online (Sandbox Code Playgroud)

它返回结果1.这是预期的,因为没有提供RTS选项.运行它如下:

./Foo +RTS -N
Run Code Online (Sandbox Code Playgroud)

返回数字6,因为我的机器中有6个处理器(同意nproc).

但是,当我以"解释模式"运行脚本时,如下所示:

GHCRTS="-N" stack runghc Foo.hs
Run Code Online (Sandbox Code Playgroud)

它会产生以下错误文本:

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
Run Code Online (Sandbox Code Playgroud)

是否有可能利用堆栈"脚本"多个核心?

mgs*_*oan 6

感谢您提出这个问题,我认为 stack 应该专门处理 GHCRTS 环境变量,并打开此 issue https://github.com/commercialhaskell/stack/issues/3444并进行了此更改https://github.com/commercialhaskell/堆栈/拉/ 3445

不幸的是,它并没有解决这种情况,因为runghc它本身(ghc)会处理GHCRTS,并且它不是用线程运行时构建的。所以不能使用环境变量解决方案。

我认为应该可以向 提供-with-rtsopts -N标志stack script --compile,但这似乎不起作用,需要进一步调查。这不适用于runghc,因为它使用解释器。