2011-12-12 85 views
6

我写了一个简单的并行矩阵乘法,使用parpseq并行矩阵乘法

运行此程序后,未转换任何火花(SPARKS: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] ]) 
+2

OT。尝试http://codereview.stackexchange.com –

+3

列表列表不是矩阵。我建议你为此目的学习和使用Repa。如果您想了解如何使用并行软件包,我鼓励您选择另一个应用程序域并重新提出问题。 –

+0

谢谢。我会尝试修复。 –

回答

3

您是否尝试过非常大的(至少1000x1000)矩阵?计算太短而无法平行。

+0

太好了,我还没有试过大数据集。谢谢。 –

+0

是不是乘法内存限制?我尝试过使用英特尔IPP Single和Multi Threaded进行图像倍增,并看到AVX使能的CPU没有收益。 – Royi