저는 GHC 6.12와의 haskell semi-explicit 병렬 처리에 대해 언급 한 바 있습니다. 필자는 다음과 같은 haskell 코드를 작성하여 fibonnaci 함수의 맵을 목록의 4 개 요소에 대해 계산하고 동시에 두 개의 요소에 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 등 ...)을 사용하려면 어떻게 프로그램을 작성할 수 있습니까? 그의 기여 상당한 속도 향상
GHC 7에서는 병렬 패키지가 크게 개선되었으므로 업그레이드를 고려할 수도 있습니다. –
당신은 몇 가지 속도를 얻기 위해 fib 함수를 memoize 수 있습니다 ... – Hai