我剛剛聲明在使用GHC 6.12的haskell半顯式並行機制中工作。我寫了下面的haskell代碼來並行計算列表中4個元素上的fibonnaci函數的映射,並且同時計算函數sumEuler上的兩個元素的映射。如何利用我的haskell並行代碼中的任何並行性?
import Control.Parallel
import Control.Parallel.Strategies
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
mkList :: Int -> [Int]
mkList n = [1..n-1]
relprime :: Int -> Int -> Bool
relprime x y = gcd x y == 1
euler :: Int -> Int
euler n = length (filter (relprime n) (mkList n))
sumEuler :: Int -> Int
sumEuler = sum . (map euler) . mkList
-- parallel initiation of list walk
mapFib :: [Int]
mapFib = map fib [37, 38, 39, 40]
mapEuler :: [Int]
mapEuler = map sumEuler [7600, 7600]
parMapFibEuler :: Int
parMapFibEuler = (forceList mapFib) `par` (forceList mapEuler `pseq` (sum mapFib + sum mapEuler))
-- how to evaluate in whnf form by forcing
forceList :: [a] ->()
forceList [] =()
forceList (x:xs) = x `pseq` (forceList xs)
main = do putStrLn (" sum : " ++ show parMapFibEuler)
,以提高我的程序並行與我比肩和PSEQ和迫使函數強制whnf評價重寫了它。我的問題是,通過查看threadscope,看起來我沒有獲得任何並行性。事情更糟,因爲我沒有獲得任何加速。
這就是爲什麼我有論文兩個問題
問題1我怎麼能修改我的代碼才能利用任何並行?
問題2如何編寫我的程序以便使用策略(parMap,parList,rdeepseq等等)?根據他的貢獻
parMapFibEuler = (mapFib, mapEuler) `using` s `seq` (sum mapFib + sum mapEuler) where
s = parTuple2 (seqList rseq) (seqList rseq)
並行出現在threadscope但不足以有顯著加速
GHC 7中的並行程序包得到了很大的改進,所以你也可以考慮升級。 – 2011-03-17 23:09:36
你可以記住你的纖維功能,以獲得一些加速... – Hai 2011-03-18 11:02:53