2011-12-12 52 views
6

Tôi đã viết phép nhân song song đơn giản bằng cách sử dụng parpseq.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] ]) 
+2

OT. Hãy thử http://codereview.stackexchange.com –

+3

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. –

+0

Cảm ơn bạn. Tôi sẽ thử Repa. –

Trả lời

3

Bạn đã thử ma trận rất lớn (ít nhất 1000x1000) chưa? Có thể tính toán quá ngắn để không thể so sánh được.

+0

Tuyệt, tôi chưa thử thiết lập dữ liệu lớn. Cảm ơn bạn. –

+0

Không phải là nhân bộ nhớ ràng buộc? Tôi đã thử Intel IPP Single so với Multi Threaded for Image Multiplication và thấy không có lợi ích nào trên CPU được kích hoạt AVX. – Royi

Các vấn đề liên quan