2017-09-20 86 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,因爲它使用解釋器。