2013-03-04 23 views
9

這是一個關於並行策略和parMap(Control.Parallel.Strategies)懷疑平行parMap和戰略

這是關於parMap rseq等價與parMap rpar

由於parMap使用parList它並行評估,因此使用rseqrpar將平行評估WHNF。不是嗎?

更新:

由於

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 

這給:

rpar . runEval . 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是多餘的,因爲它爲每個可遍歷元素產生兩個火花。 !

回答

4

快速煙氣測試表明是的parMap rseqparMap rpar都被並行評估。

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] 

,然後使用各種result_____我計時編譯好的二進制文件

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

,看到resultPlainresultParresultSeq(約2倍以上)和resultParresultSeq更長的時間進行了比較相同定時。

更詳細的信息納入GHC對Eval monad的實際解釋是缺乏的,但鑑於parMap strat f = withStrategy (parList strat) . map f以及這個實驗的結果,我感到有信心讓列表中的每個元素都被引用來評估WHNF。