2011-12-12 23 views
6

parpseqを使用して、単純な並列行列乗算を書きました。並列行列乗算

このプログラムを実行すると、スパークは変換されませんでした(SPARKS:20(0変換、0プルーン))。

このプログラムの改善についてのご意見をお聞きしたいと思います。

また、ハスケルでの並列プログラミングを学習するアプローチについても説明します。

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

ありがとうございます。私はRepaを試してみる。 –

答えて

3

非常に大きい(1000x1000以上の)マトリックスを試しましたか?パラレル化するには計算が短すぎる可能性があります。

+0

偉大な、私は大きなデータセットを試していない。ありがとうございました。 –

+0

倍精度浮動小数点型メモリはバインドされていませんか?私はIntel IPP Single対Multi Threaded for Image Multiplicationを試してみましたが、AVX対応CPUで何の利益も見せていませんでした。 – Royi