結果。 Parallel and Concurrent Programming in Haskellから、フィボナッチを平行して2つの方法で実行しました:は、与えられた
(1)リスト全体でparMap
を使用してください。半分に(最初main
) (2)カットリスト、前述のテキストを読むことから(第2 main
)
rpar
で各作業を分割、私は速いと#1を期待ただろう:
これは、コードを並列化するときの重要な原則を示しています。小さなチャンクを固定した数のチャンクに分割しないようにしてください。
私はコンパイルを介して(唯一の他をコメントアウト、1 main
を含む)の両方を実行しました:
- コンパイル -
ghc -O2 Fib.hs -threaded -rtsopts -eventlog
- 実行 - ここ
.\Fib.exe +RTS -N2 -s
がための結果であります(1)および(2)のそれぞれ:
(1) - (2)parMap
Tot time (elapsed) Avg pause Max pause
Gen 0 0 colls, 0 par 0.000s 0.000s 0.0000s 0.0000s
Gen 1 2 colls, 1 par 0.000s 0.000s 0.0001s 0.0001s
Parallel GC work balance: 84.39% (serial 0%, perfect 100%)
TASKS: 4 (1 bound, 3 peak workers (3 total), using -N2)
SPARKS: 80 (74 converted, 0 overflowed, 0 dud, 0 GC'd, 6 fizzled)
INIT time 0.000s ( 0.000s elapsed)
MUT time 8.594s ( 4.331s elapsed)
GC time 0.000s ( 0.000s elapsed)
EXIT time 0.000s ( 0.000s elapsed)
Total time 8.594s ( 4.332s elapsed)
Alloc rate 12,259 bytes per MUT second
Productivity 100.0% of total user, 198.4% of total elapsed
を使用する - 私はテキストがでヒントし理解して分割リスト+各半分
Tot time (elapsed) Avg pause Max pause
Gen 0 0 colls, 0 par 0.000s 0.000s 0.0000s 0.0000s
Gen 1 2 colls, 1 par 0.000s 0.000s 0.0002s 0.0003s
Parallel GC work balance: 12.41% (serial 0%, perfect 100%)
TASKS: 4 (1 bound, 3 peak workers (3 total), using -N2)
SPARKS: 40 (10 converted, 0 overflowed, 0 dud, 0 GC'd, 30 fizzled)
INIT time 0.000s ( 0.001s elapsed)
MUT time 7.453s ( 3.751s elapsed)
GC time 0.000s ( 0.000s elapsed)
EXIT time 0.000s ( 0.000s elapsed)
Total time 7.453s ( 3.752s elapsed)
Alloc rate 14,398 bytes per MUT second
Productivity 100.0% of total user, 198.6% of total elapsed
にrpar
を使用する理由、ありませんでしたparMap
のバージョンは分割したものよりも速い+ rpar
バージョンですか?
詳細な回答ありがとうございます、ErikR。私自身の理解のために、 'parMap rpar fib'の' parMap'に対する最初の適切な引数は何でしょうか? –
一般的に私はいつも 'parMap rdeepseq ...'を使うことを勧めます。 – ErikR