2013-03-04 11 views
9

それは並列戦略やparMap(Control.Parallel.Strategies)についての疑問です並列parMapと戦略

それはparMap rparで約parMap rseq同値です。

parMapparListを使用しているため、rseqまたはrparのいずれかを使用すると、WHNFと並行して評価されます。ではない ?

更新:

rpar . runEval . rseq 
を:

parMap strat f = (`using` parList strat) . map f 

parList = parTraversable 

parTraversable strat = evalTraversable (rpar `dot` strat) 

evalTraversable = traverse 

strat2 `dot` strat1 = strat2 . runEval . strat1 

parMap rseqので

が与える戦略

rpar `dot` rseq 

を使用

与える:

(\x -> x `par` return x) . runEval . (\x -> x `pseq` return x) 

結果を考えることは困難です。


更新:

なるほど、遅延評価は、第一の組成物の第一の機能をとり、トラバース容器内のすべての要素が平行のためにスパークする

(\x -> x `par` return x) 

グラント可能であれば計算。

だから我々は(RPAR dot RSEQ)(RSEQ dot RPAR)と等価であることを追加することができ、そうではありませんか?

そして、parMap rparは、トラバース可能な要素ごとに2つのスパークを生成する点で冗長です。 !!

答えて

4

迅速な煙検査では、「parMap rseq」と「parMap rpar」の両方が並行して評価されることがわかります。私がコンパイルされたバイナリに

ghc -threaded --make rpar 
time ./rpar +RTS -N4 

を時限とresultPlainが(約2倍長い)はるかに長いresultParまたはresultSeqよりだったとresultParresultSeqが比較的全く同じだったことがわかりましたresult_____の各種類を使用して

import Control.Parallel.Strategies 

fib 0 = 1 
fib 1 = 1 
fib n = fib (n-1) + fib (n-2) 

main = print resultPlain where 
    resultPlain = [fib 34, fib 34, fib 34, fib 34] 
    resultPar = parMap rpar id [fib 34, fib 34, fib 34, fib 34] 
    resultSeq = parMap rseq id [fib 34, fib 34, fib 34, fib 34] 

し、その後、時限。

EvalモナドのGHCの実際の解釈の詳細は不足していますが、この実験の結果とともにparMap strat f = withStrategy (parList strat) . map fが与えられているので、リストの各要素がWHNFへの評価のために呼び出されると確信しています。