2017-09-20 15 views
6

script私はマシン内の複数のプロセッサをmapMと交換して、Async.mapConcurrentlyと交換したいと考えていました。スタックrunghcを使用したマルチコア並列

このケースでは速度の増加は見られませんでしたが、runghcが実際に複数のコアを使用できることを確認したかったのです。私は次のようにファイルをコンパイルする場合

import Control.Concurrent 

main = print =<< Control.Concurrent.getNumCapabilities 

stack ghc -- -threaded Foo.hs 

をし、それを実行し、次のように:

は、ファイル Foo.hsを考えると

./Foo 

それが結果を返す1 。これは、RTSオプションが提供されていないため、予想されます。次のように代わりにそれを実行している:私のマシンで6つのプロセッサがあるよう

./Foo +RTS -N 

は、数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

おかげで、私は、それは、runghc自体ので(GHC)がこの事件を解決しませんスタックが特別にGHCRTS環境変数を扱う必要があると思うし、この問題https://github.com/commercialhaskell/stack/issues/3444を開き、https://github.com/commercialhaskell/stack/pull/3445

残念ながら、この変更を行いましたGHCRTSを処理し、スレッド化されたランタイムではビルドされません。したがって、環境変数ソリューションは使用できません。

-with-rtsopts -Nフラグをstack script --compileに提供することは可能だと思いますが、それは機能していないようです。詳細な調査が必要です。これはインタープリタを使用しているため、runghcでは機能しません。

関連する問題