Acabo de decir que trabajé en el paralelismo semi-explícito de Haskell con GHC 6.12. He escrito el siguiente código haskell para calcular en paralelo el mapa de la función fibonnaci sobre 4 elementos en una lista, y al mismo tiempo el mapa de la función sumEuler sobre dos elementos.¿Cómo explotar cualquier paralelismo en mi código paralelo 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)
para mejorar mi programa en paralelo Reescribí con par y PSEQ y un forzamiento función para forzar la evaluación whnf. Mi problema es que al mirar en el subámbito parece que no obtuve ningún paralelismo. Las cosas son peores porque no gané ninguna aceleración.
Eso por eso que tengo dos preguntas tesis
Pregunta 1 ¿Cómo podría modificar mi código para explotar cualquier paralelismo?
Pregunta 2 ¿Cómo podría escribir mi programa para usar Strategies (parMap, parList, rdeepseq y así sucesivamente ...)?
primera mejora con estrategias
según su contribución
parMapFibEuler = (mapFib, mapEuler) `using` s `seq` (sum mapFib + sum mapEuler) where
s = parTuple2 (seqList rseq) (seqList rseq)
el paralelismo aparece en la threadscope pero no lo suficiente como para tener una aceleración significativa
El paquete paralelo se ha mejorado mucho en GHC 7, por lo que también podría considerar la actualización. –
Puede memorizar sus funciones fib para ganar velocidad ... – Hai