Tôi đã viết phép nhân song song đơn giản bằng cách sử dụng par
và pseq
.Phép nhân ma trận song song
Sau khi chạy chương trình này, không có tia lửa nào được chuyển đổi (SPARKS: 20 (0 được chuyển đổi, 0 cắt tỉa)).
Tôi muốn nghe ý kiến của bạn về việc cải thiện chương trình này.
Cũng về phương pháp tiếp cận để học lập trình song song trong 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. Hãy thử http://codereview.stackexchange.com –
Danh sách các danh sách không phải là ma trận. Tôi đề nghị bạn học và sử dụng Repa cho mục đích này. Nếu bạn muốn tìm hiểu cách sử dụng gói song song, tôi khuyến khích bạn chọn miền ứng dụng khác và hỏi lại câu hỏi. –
Cảm ơn bạn. Tôi sẽ thử Repa. –