2013-03-04 2 views
9

Это сомнение относительно параллельных стратегий и parMap (Control.Parallel.Strategies)параллельно parMap и стратегии

Это о parMap rseq эквивалентности с parMap rpar.

С parMap использует parList, он оценивается параллельно, поэтому с использованием rseq или rpar будет оцениваться параллельно с WHNF. Не так ли?

Update:

С

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 rseq и parMap 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 

и увидел, что resultPlain было гораздо больше, чем resultPar или resultSeq (примерно в 2 раза больше) и resultPar и resultSeq были сравнительно одинаково приуроченная.

Более подробная информация о фактической интерпретации GHC монады Eval отсутствует, но при условии, что parMap strat f = withStrategy (parList strat) . map f вместе с результатами этого эксперимента я уверен, что каждый элемент в списке искривлен для оценки WHNF.

Смежные вопросы