コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

Haskellで並列計算

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使用率を見ながらやると分かりやすいです。