2017-09-20 41 views
6

我一直在努力script其中我希望通过更换mapMAsync.mapConcurrently来利用我的机器中的多个处理器。多堆并行与堆栈runghc

在这种情况下观察没有速度增加,我想验证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 

是否有可能利用具有堆栈多核“剧本“?

回答

4

感谢您问这个问题,我认为栈应该特别处理GHCRTS环境变量,并打开这个问题https://github.com/commercialhaskell/stack/issues/3444https://github.com/commercialhaskell/stack/pull/3445

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

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