Haskellで並列計算してみる。
もっと難しい方法もあるみたいだけれど。
ここを参考にした。
Dadakusa Log: Haskellで楽に並列処理
monad-parallelというパッケージを使うのでインストールしてください。
Control.Monad.Parallelをインポートすると、
sequenceとかmapMとかが並列計算するようになります。
-- Para.hs -- module Para where import qualified Control.Monad.Parallel as P import Data.Time fib :: Integer -> Integer fib 0 = 1 fib 1 = 1 fib n = fib (n-2) + fib (n-1) spFib :: IO [()] spFib = P.sequence [print $ fib x | x <- [1..40]] main = do t1 <- getCurrentTime spFib t2 <- getCurrentTime print $ diffUTCTime t2 t1
並列計算したい関数を作って、
それに一旦(IO)モナドをかぶせてから、
sequenceする流れです。
実行結果
ビルドしないと動きません。インタプリタじゃだめですよ。
$ ghc -threaded --make Para.hs -O $ Para.exe +RTS -N
これで動きます。
まずは$ Para.exeで並列計算しないとき。
C:\Haskell\parallel2>ghc -threaded --make Para.hs -O [1 of 1] Compiling Main ( Para.hs, Para.o ) Linking Para.exe ... C:\Haskell\parallel2>Para.exe 1 3 2 (略) 102334155 165580141 63.1086096s
$ Para.exe +RTS -Nで並列計算したとき。
C:\Haskell\parallel2>Para.exe +RTS -N 1 2 3 (略) 63245986 165580141 49.1318102s
(ちびっとだけ?)速くなりましたね。
タスクマネージャーのCPU使用率を見ながらやると分かりやすいです。