2011-12-12 19 views
6

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] ]) 
+2

OT. Pruebe http://codereview.stackexchange.com –

+3

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. –

+0

Gracias. Voy a intentar Repa. –

Respuesta

3

¿Has probado matrices muy grandes (al menos 1000x1000)? Es posible que el cálculo sea demasiado corto para paralelizar.

+0

Genial, no he intentado un gran conjunto de datos. Gracias. –

+0

¿No hay memoria de multiplicación? Probé Intel IPP Single vs. Multi Threaded for Image Multiplication y no vi ganancias en la CPU habilitada con AVX. – Royi