我写了一个简单的并行矩阵乘法,使用par
和pseq
。并行矩阵乘法
运行此程序后,未转换任何火花(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] ])
OT。尝试http://codereview.stackexchange.com –
列表列表不是矩阵。我建议你为此目的学习和使用Repa。如果您想了解如何使用并行软件包,我鼓励您选择另一个应用程序域并重新提出问题。 –
谢谢。我会尝试修复。 –