2013-03-04 17 views
9

E 'un dubbio su strategie parallele e parMap (Control.Parallel.Strategies)parMap parallelo e strategie

Si tratta di parMap rseq equivalenza con parMap rpar.

Dal parMap utilizza parList valuta in parallelo, quindi utilizzando rseq o rpar verrà valutato in parallelo a WHNF. Non è vero?

Aggiornamento:

Dal

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 utilizza la strategia

rpar `dot` rseq 

che dà:

rpar . runEval . rseq 

che dà:

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

E 'difficile pensare al risultato.


Aggiornamento:

vedo, la valutazione pigra prende la prima funzione della composizione prima, e

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

garantisce che ogni elemento nel contenitore traslabile possa essere innescato per un parallelo calcolo quando possibile.

Così abbiamo potuto aggiungere che (rpar dot rseq) è equivalente a (rseq dot rpar), non è vero?

E che parMap rpar è ridondante in quanto genera due scintille per ogni elemento attraversabile. !!

risposta

4

Un rapido test del fumo rivela che sì parMap rseq e parMap rpar vengono entrambi valutati in parallelo.

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] 

e poi, utilizzando ogni tipo di result_____ ho cronometrato i binari compilati

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

e ho visto che resultPlain era molto più lungo di resultPar o resultSeq (circa 2x più lungo) e resultPar e resultSeq erano relativamente identicamente cronometrato.

Maggiori dettagli in vera interpretazione di GHC del Eval Monade sono carenti, ma dato che parMap strat f = withStrategy (parList strat) . map f insieme ai risultati di questo esperimento mi sento fiducioso dicendo ogni elemento della lista è scatenato per la valutazione a WHNF.