Параллельное матричное умножение - PullRequest
6 голосов
/ 12 декабря 2011

Я написал простое параллельное умножение матриц, используя par и pseq.

После запуска этой программы ни один из искр не преобразовался (ИСКРА: 20 (0 преобразовано, 0 сокращено)).

Я хотел бы услышать ваш комментарий об улучшении этой программы.

Также о подходах к изучению параллельного программирования на 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] ])

1 Ответ

3 голосов
/ 13 декабря 2011

Вы пробовали очень большие (по крайней мере 1000x1000) матрицы? Возможно, вычисление слишком короткое, чтобы его можно было параллелизировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...