堆栈梯级的多核并行性

时间:2017-09-20 00:47:39

标签: haskell parallel-processing haskell-stack

我一直在使用script,我希望通过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 个答案:

答案 0 :(得分:4)

感谢您提出这个问题,我认为堆栈应该专门处理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,因为它使用解释器。