2011-12-12 13 views
6

मैंने par और pseq का उपयोग करके एक साधारण समांतर मैट्रिक्स गुणा लिखा था।समांतर मैट्रिक्स गुणन

इस कार्यक्रम को चलाने के बाद, कोई भी स्पार्क परिवर्तित नहीं हुआ (स्पार्क्स: 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

ओटी। कोशिश करें http://codereview.stackexchange.com –

+3

सूचियों की एक सूची एक मैट्रिक्स नहीं है। मेरा सुझाव है कि आप इस उद्देश्य के लिए रेपा सीखें और उपयोग करें। यदि आप समांतर पैकेज का उपयोग करना सीखना चाहते हैं, तो मैं आपको एक और एप्लिकेशन डोमेन चुनने और प्रश्न पूछने के लिए प्रोत्साहित करता हूं। –

+0

धन्यवाद। मैं रेपा की कोशिश करूंगा। –

उत्तर

3

क्या आपने बहुत बड़ी (कम से कम 1000x1000) मैट्रिक्स की कोशिश की? यह संभव है कि गणना को पक्षाघात के लिए बहुत छोटा हो।

+0

बढ़िया, मैंने बड़े डेटा सेट की कोशिश नहीं की है। धन्यवाद। –

+0

गुणा बाउंड नहीं है? मैंने छवि गुणन के लिए इंटेल आईपीपी सिंगल बनाम मल्टी थ्रेडेड की कोशिश की और एवीएक्स सक्षम सीपीयू पर कोई लाभ नहीं देखा। – Royi