Я только что сообщил о работе с полуявным параллелизмом haskell с GHC 6.12. Я написал следующий код haskell для параллельного вычисления карты функции fibonnaci по 4 элементам в списке, и в то же время отображение функции sumEuler на двух элементах.
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)
для параллельного улучшения моей программы я переписал ее с помощью par и pseq и форсирования для принудительной оценки WHNF. Моя проблема в том, что, глядя в область потоков, кажется, что я не получил никакого параллелизма. Ситуация хуже, потому что я не получил никакого ускорения.
Вот почему у меня есть два этих вопроса
Вопрос 1 Как я могу изменить свой код, чтобы использовать любой параллелизм?
Вопрос 2 Как Могу ли я написать свою программу, чтобы использовать стратегии (parMap, parList, rdeepseq и так далее ... )?
Первое улучшение в Strategies
Согласно его вкладу
parMapFibEuler = (mapFib, mapEuler) `using` s `seq` (sum mapFib + sum mapEuler) where
s = parTuple2 (seqList rseq) (seqList rseq)
параллелизм появляется в Threadcope, но его недостаточно для значительного ускорения