Escribí una simple multiplicación de matriz paralela usando par
y pseq
.Multiplicación de matriz paralela
Después de ejecutar este programa, ninguna de las chispas se convirtió (CHISPAS: 20 (0 convertido, 0 podado)).
Me gustaría escuchar su comentario sobre la mejora de este programa.
También acerca de los enfoques para el aprendizaje de programación paralela en Haskell.
import Data.List
import Control.Parallel
parHelp :: (Num a) => [ a ] -> [ a ] -> a
parHelp [] [] = 0
parHelp (x : xs) (y : ys) = ret where
ret = par a (pseq b (a + b)) where
a = x * y
b = parHelp xs ys
helpMult :: (Num a) => [ a ] -> [ [ a ] ] -> [ a ]
helpMult _ [] = []
helpMult x (y : ys) = ret where
ret = par a (pseq b (a : b)) where
a = sum . zipWith (*) x $ y
b = helpMult x ys
mult :: (Num a) => [ [ a ] ] -> [ [ a ] ] -> [ [ a ] ]
mult [] _ = []
mult (x : xs) ys = ret where
ret = par a (pseq b (a : b)) where
a = helpMult x ys
b = mult xs ys
main = print $ mult [[1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4] ] (transpose [[1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4 ] , [ 1 .. 4] ])
OT. Pruebe http://codereview.stackexchange.com –
Una lista de listas no es una matriz. Sugiero que aprenda y use Repa para este propósito. Si desea aprender a usar el paquete paralelo, le sugiero que seleccione otro dominio de aplicación y vuelva a hacer la pregunta. –
Gracias. Voy a intentar Repa. –