2017-05-14 14 views
2

Haskellで並列計算を行うのに問題があります。私は、並列と非並列の形式で非常に単純な計算を試みましたが、非並列のものは数秒高速でした。私は何か間違っているのですか?これがなぜそのようなのでしょうか?前もって感謝します。parが効果を持たない


これは私のテストコードの並列バージョンです:

-- par.hs 
import Control.Parallel 
a = sum [1, 3 .. 99999999] 
b = sum [2, 4 .. 100000000] 
main = (a `par` b) `pseq` print (a + b) 

、これは非平行バージョンです:いいえ

-- nopar.hs 
a = sum [1, 3 .. 99999999] 
b = sum [2, 4 .. 100000000] 
main = print (a + b) 

が、私はそれをしようとしたとき、並列化が持っていました、またはさらに悪影響:

➜ ghc par.hs 
[1 of 1] Compiling Main    (par.hs, par.o) 
Linking par ... 
➜ ghc nopar.hs 
[1 of 1] Compiling Main    (nopar.hs, nopar.o) 
Linking nopar ... 
➜ time ./par 
5000000050000000 
./par 35.02s user 12.83s system 92% cpu 51.501 total 
➜ time ./nopar 
5000000050000000 
./nopar 31.33s user 6.44s system 98% cpu 38.441 total 
+0

あなたは数字の合計です。違いを見るのはそれほど簡単ではないでしょう。 – Carcigenicate

+1

'-threaded'フラグをGHCに追加して、複数のシステムスレッドを使用できるRTSを実際に使用するようにしてください。 – Carl

+0

@Carcigenicate明らかに、30秒間シングルスレッドを実行するのには些細なことはありません。あなたが2つのスレッドでそれを半分にすることができると仮定するのは妥当と思われます。 – amalloy

答えて

4

IIUC、@Carlと@Zeta別コメント数の組み合わせこのアドレス:理由は

$ ghc -threaded -O2 par.hs && time ./par 
50000005000000 

real 0m2.303s 
user 0m2.124s 
sys  0m0.176s 

$ ghc par.hs && ./par +RTS -N2 
Linking par ... 
par: the flag -N2 requires the program to be built with -threaded 
par: 
par: Usage: <prog> <args> [+RTS <rtsopts> | -RTS <args>] ... --RTS <args> 
par: 
par: +RTS Indicates run time system options follow 
par: -RTS Indicates program arguments follow 
par: --RTS Indicates that ALL subsequent arguments will be given to the 
par:   program (including any of these RTS flags) 

$ ghc -threaded -O2 par.hs && time ./par +RTS -N2 
50000005000000 

real 0m1.572s 
user 0m2.816s 
sys  0m0.296s 

を、ここではデフォルトでReal World Haskell

からいくつか抜粋である、GHCは1つだけ使用するプログラムを生成し、たとえ我々が明示的に並行コードを書いているとしても。複数のコアを使用するには、明示的に選択する必要があります。実行可能プログラムを生成しているときに、この選択をリンク時に行います。 ... -threadedオプションをコンパイラに渡すと、プログラムとスレッド化されたランタイムライブラリがリンクされます。

私たちは、プログラムのコマンドラインでGHCのランタイムシステムにオプションを渡すことができます。ランタイムは、コードに制御を渡す前に、特別なコマンドラインオプション+ RTSのプログラム引数をスキャンします。スレッド化されたランタイムは-Nオプションを受け取ります。これは、GHCのランタイムシステムが使用すべきコアの数を指定する1つの引数をとります。

関連する問題