par
とpseq
を使用して、単純な並列行列乗算を書きました。並列行列乗算
このプログラムを実行すると、スパークは変換されませんでした(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] ])
OT。試してみてくださいhttp://codereview.stackexchange.com –
リストのリストは行列ではありません。私はあなたがこの目的のためにRepaを学び、使用することをお勧めします。パラレルパッケージの使用方法を知りたい場合は、別のアプリケーションドメインを選択して質問をし直すことをお勧めします。 –
ありがとうございます。私はRepaを試してみる。 –