2017-03-07 8 views
5

मैं निम्नलिखित matlab कोड भाग गया:क्यों आव्यूह गुणन अपने लैपटॉप पर 7 से कोर के साथ काम स्टेशन पर धीमी चलती है?

rng(1) 
matrix_size = 200; 
iterations = 100000; 
A = rand(matrix_size); 
B = rand(matrix_size); 

profile on 
for i = 1:iterations 
    A * B; 
end 
profile off 

मेरी MacAir (इंटेल (आर) कोर (टीएम) i5-4260U सीपीयू @ 1.40GHz) पर, यह 39s लेता है। 7 कोर (इंटेल (आर) जिऑन (आर) सीपीयू E5-2687W v4 @ 3.00GHz) के साथ एक कार्य केंद्र पर, इस 62s लेता है।

मैं -singleCompThread निर्दिष्ट नहीं किया। कार्य स्टेशन में 12 कोर हैं, लेकिन 5 एकल-थ्रेडेड प्रक्रियाएं चल रही थीं। मेरे पास (लगभग) 7 कोर थे। वे पूरे समय अधिकतम कर दिए गए थे।

यह कैसे हो सकता है?

-singleCompThread साथ ऊपर कोड चल रहा है, यह 54s में पूरा करता है।

+0

आपको यह परीक्षण विशिष्ट मैट्रिक्स के साथ चलाना चाहिए, यादृच्छिक matrices नहीं। यादृच्छिकता एक कारक हो सकता है। – Wolfie

+2

ध्यान दें कि 'rng (1)' की वजह से मैट्रिस दोनों मशीनों पर समान हैं, जो बीज सेट करता है। – Kappie001

+1

क्या होता है यदि आप ['timeit'] (https://www.mathworks.com/help/matlab/ref/timeit.html) का उपयोग करके एक ही परीक्षण करते हैं? I = 1 के लिए 'f = @() आज़माएं: पुनरावृत्तियों; ए * बी; अंत; 'फिर' टी = टाइमिट (एफ); '। – craigim

उत्तर

1

एक Mathworks सहायता टीम post का हवाला देते हुए:

MATLAB 7.4 (R2007a) के रूप में, MATLAB कार्यों और भाव कि तत्व के लिहाज से कार्यों का संयोजन (जैसे y हैं की एक संख्या के लिए बहु-क्रम गणना का समर्थन करता है = 4 * एक्स * (पाप (एक्स) + एक्स^3))। इन कार्यों को स्वचालित रूप से एक से अधिक थ्रेड पर निष्पादित और आप स्पष्ट आदेशों निर्दिष्ट की जरूरत नहीं है अपने कोड में धागे बनाने के लिए।

एक समारोह या अभिव्यक्ति तेजी से (तेजी लाने के) कई पर कोर पर अमल करने के लिए, निम्न स्थितियों के सत्य होना चाहिए:

1) एल्गोरिथ्म समारोह द्वारा किया जाता में आपरेशन आसानी से वर्गों में विभाजित हैं जिसे समवर्ती रूप से निष्पादित किया जा सकता है, और कम संचार या कुछ अनुक्रमिक संचालन के साथ आवश्यक है। यह सभी तत्व-वार संचालन के मामले में है।

2) डेटा का आकार इतना बड़ा है कि समवर्ती निष्पादन के किसी भी लाभ डेटा को विभाजित करने के लिए आवश्यक समय से अधिक है और अलग निष्पादन थ्रेड प्रबंधित करें। उदाहरण के लिए, अधिकांश कार्य केवल तक गति करते हैं जब सरणी कई हजार तत्वों से अधिक होती है।

3) ऑपरेशन स्मृति-बाध्य नहीं है जहां प्रसंस्करण समय मेमोरी एक्सेस टाइम का प्रभुत्व है, जैसा कि सरल संचालन जैसे तत्व-वार जोड़ के मामले में है। एक सामान्य नियम के रूप में, अधिक जटिल फ़ंक्शंस सरल कार्यों की तुलना में तेज़ी से बढ़ते हैं।

आपका मामला 2 या 3 पूर्ण नहीं होता है। गुणा बहुत तेज और सरल है और स्मृति बाध्य है, और आपके matrices अपेक्षाकृत छोटे हैं। मल्टीथ्रेडिंग में अधिक ओवरहेड शामिल होगा, जैसा कि आपके परीक्षण से -singleCompThread के साथ देखा गया है। आप एक बड़े मैट्रिक्स के साथ बेंचमार्क आज़मा सकते हैं और देख सकते हैं कि अंतर बदलता है या नहीं। आप मैकबुक पर बेंचमार्क को -singleCompThread के साथ भी देख सकते हैं ताकि यह देखने के लिए कि रिश्तेदार एकल थ्रेड प्रदर्शन अपेक्षित सीमा में आता है या नहीं।

एक और (आंशिक) स्पष्टीकरण सैंडी ब्रिज और हैसवेल, यानी AVX2 के बीच विभिन्न वेक्टर निर्देश हो सकता है। हालांकि मैं उसमें देखने से पहले पहले बेंचमार्क करता हूं।

यह भी ध्यान दें कि मैटलैब प्रोफाइलर जेआईटी बंद कर देता है।तो आपके द्वारा प्राप्त किए गए नतीजे आपके द्वारा बेंचमार्किंग के वास्तविक मामले के बराबर नहीं हो सकते हैं।

संबंधित मुद्दे