12

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

parMap rseqと同等程度ですparMap rpar

parMapを使用するためparList、並列に評価されるため、 or のいずれ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 rseq) は(rseq dotrpar dot)同等であると付け加えることができますよね?

これparMap rparは、通過可能な要素ごとに 2 つのスパークを生成するという点で冗長です。!!

4

1 に答える 1

5

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

そして、それはorresultPlainよりもはるかに長く(約 2 倍長く)、とは比較的同じタイミングでした。resultParresultSeqresultParresultSeq

EvalGHC によるモナドの実際の解釈の詳細は不足parMap strat f = withStrategy (parList strat) . map fしていますが、この実験の結果と合わせて、リスト内の各要素が WHNF への評価のために起動されると自信を持って言えます。

于 2013-03-04T06:11:58.537 に答える