Eval
私はmonadとrpar
Strategy
Haskellで問題に遭遇しました。次のコードを検討してください。
module Main where
import Control.Parallel.Strategies
main :: IO ()
main = print . sum . inParallel2 $ [1..10000]
inParallel :: [Double] -> [Double]
inParallel xss = runEval . go $ xss
where
go [] = return []
go (x:xs) = do
x' <- rpar $ x + 1
xs' <- go xs
return (x':xs')
inParallel2 :: [Double] -> [Double]
inParallel2 xss = runEval . go $ xss
where
go [] = return []
go [x] = return $ [x + 1]
go (x:y:xs) = do
(x',y') <- rpar $ (x + 1, y + 1)
xs' <- go xs
return (x':y':xs'
私はそれを次のようにコンパイルして実行します:
ghc -O2 -Wall -threaded -rtsopts -fforce-recomp -eventlog eval.hs
./eval +RTS -N3 -ls -s
関数を使用inParallel
すると、並列処理は期待どおりに機能します。出力ランタイム統計では、次のように表示されます。
SPARKS: 100000 (100000 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)
関数に切り替えると、inParallel2
すべての並列処理がなくなります。
SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)
タプルの評価が並行して機能しないのはなぜですか?タプルをrparに渡す前に、タプルを強制してみました。
rpar $!! (x + 1, y + 1)
しかし、それでも結果はありません。私は何が間違っているのですか?