मेरा मैट्रिक्स-वेक्टर गुणन स्केलिंग क्यों नहीं है?


15

लंबे पद के लिए क्षमा करें, लेकिन मैं वह सब कुछ शामिल करना चाहता था जो मैंने सोचा था कि पहली बार में प्रासंगिक था।

मैं क्या चाहता हूँ

मैं घने मैट्रिस के लिए क्रिलोव सबस्पेस मैथड्स के समानांतर संस्करण को लागू कर रहा हूं मुख्य रूप से GMRES, QMR और CG। मुझे एहसास हुआ (प्रोफाइलिंग के बाद) कि मेरी DGEMV दिनचर्या दयनीय थी। इसलिए मैंने इसे अलग करके उस पर ध्यान केंद्रित करने का फैसला किया। मैंने इसे 12 कोर मशीन पर चलाने की कोशिश की है, लेकिन नीचे दिए गए परिणाम 4 कोर इंटेल i3 लैपटॉप के लिए हैं। प्रवृत्ति में बहुत अंतर नहीं है।

मेरा KMP_AFFINITY=VERBOSEआउटपुट यहाँ उपलब्ध है

मैंने एक छोटा कोड लिखा है:

size_N = 15000
A = randomly_generated_dense_matrix(size_N,size_N); %Condition Number is not bad
b = randomly_generated_dense_vector(size_N);
for it=1:n_times %n_times I kept at 50 
 x = Matrix_Vector_Multi(A,b);
end

मेरा मानना ​​है कि यह 50 पुनरावृत्तियों के लिए CG के व्यवहार का अनुकरण करता है।

मैंने क्या कोशिश की है:

अनुवाद

मैंने मूल रूप से फोरट्रान में कोड लिखा था। मैंने इसका अनुवाद C, MATLAB और अजगर (Numpy) में किया। कहने की जरूरत नहीं है, MATLAB और पायथन भयानक थे। आश्चर्यजनक रूप से, C उपरोक्त मूल्यों के लिए एक या दो से फोरट्रान से बेहतर था। लगातार।

रूपरेखा

मैंने अपने कोड को चलाने के लिए प्रोफाइल किया और यह 46.075सेकंड के लिए चला । यह तब था जब MKL_DYNAMIC को सेट किया गया थाFALSE और सभी कोर का उपयोग किया गया था। यदि मैं MKL_DYNAMIC को सही के रूप में उपयोग करता हूं, तो केवल (लगभग) कोर की आधी संख्या किसी भी समय उपयोग में थी। यहाँ कुछ विवरण हैं:

Address Line    Assembly                CPU Time

0x5cb51c        mulpd %xmm9, %xmm14     36.591s

सबसे अधिक समय लेने वाली प्रक्रिया लगती है:

Call Stack                          LAX16_N4_Loop_M16gas_1
CPU Time by Utilization             157.926s
CPU Time:Total by Utilization       94.1%
Overhead Time                       0us
Overhead Time:Total                 0.0%    
Module                              libmkl_mc3.so   

यहां कुछ तस्वीरें हैं:यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

निष्कर्ष:

मैं प्रोफाइलिंग में एक वास्तविक शुरुआत कर रहा हूं लेकिन मुझे एहसास है कि गति अभी भी अच्छी नहीं है। अनुक्रमिक (1 कोर) कोड 53 सेकंड में समाप्त होता है । यह 1.1 से कम की गति है!

असली सवाल: मुझे अपना स्पीडअप सुधारने के लिए क्या करना चाहिए?

सामान है कि मुझे लगता है कि मदद कर सकता है, लेकिन मुझे यकीन नहीं हो सकता है:

  • Pthreads कार्यान्वयन
  • MPI (ScaLapack) कार्यान्वयन
  • मैनुअल ट्यूनिंग (मुझे नहीं पता कि कैसे। यदि आप यह सुझाव देते हैं तो कृपया एक संसाधन की सिफारिश करें)

यदि किसी को अधिक (विशेष रूप से स्मृति के बारे में) विवरण की आवश्यकता है, तो कृपया मुझे बताएं कि मुझे क्या चलना चाहिए और कैसे। मैंने पहले कभी मेमोरी को प्रोफाईल नहीं किया।

जवाबों:


20

आपका मैट्रिक्स 15,000 x 15,000 आकार का है, इसलिए आपके पास मैट्रिक्स में 225M तत्व हैं। यह लगभग 2GB मेमोरी के लिए बनाता है। यह आपके प्रोसेसर के कैश आकार से बहुत अधिक है, इसलिए इसे प्रत्येक मैट्रिक्स गुणन में मुख्य मेमोरी से पूरी तरह से लोड करना पड़ता है, जिससे लगभग 100GB डेटा ट्रांसफर होता है, साथ ही आपको स्रोत और गंतव्य वैक्टर के लिए क्या चाहिए।

आई 3 की अधिकतम मेमोरी बैंड इंटेल स्पेक्स के आधार पर लगभग 21 जीबी / एस है, लेकिन यदि आप वेब के चारों ओर देखते हैं, तो आप पाएंगे कि अधिकांश भाग वास्तव में उपलब्ध हैं। इस प्रकार, बहुत कम से कम, आप अपने बेंचमार्क को पिछले 10 सेकंड की उम्मीद करेंगे, और 45 सेकंड के आपके वास्तविक माप अभी तक उस निशान से दूर नहीं हैं।

इसी समय, आप कुछ 10 बिलियन फ़्लोटिंग पॉइंट मल्टीप्लीज़ और ऐड भी कर रहे हैं। विचार करते हुए, कहते हैं, संयोजन के लिए 10 घड़ी चक्र, और 3 गीगाहर्ट्ज घड़ी की दर, आप ~ 30 सेकंड में बाहर आ जाएंगे। निश्चित रूप से, वे सट्टा मेमोरी लोड के साथ समवर्ती चला सकते हैं यदि कैश चालाक है।

सब सब में, मैं कहूँगा कि तुम निशान से बहुत दूर नहीं हो। आपने क्या उम्मीद की होगी?


वहाँ 2-3 की एक गति कम से कम हो रही का एक तरीका नहीं है?
inquest

@ नोनीसिक - आप SiSoftware Sandra जैसे उपकरण का उपयोग करके अपने सिस्टम पर मेमोरी प्रदर्शन को बेंचमार्क करना चाह सकते हैं। वुल्फगैंग विश्लेषण मुझ पर स्पॉट दिखता है, यदि आपका एप्लिकेशन मेमोरी बैंडविड्थ बाउंड है, तो समानांतरकरण कुछ कम करने में मदद करेगा। इसके अलावा, आपके पास मौजूद किसी भी बिजली बचत विकल्प को देखें, वे मेमोरी प्रदर्शन को थ्रॉटल कर सकते हैं। इसके अलावा, उच्च गुणवत्ता वाली मेमोरी के साथ अपनी मेमोरी को बदलने पर विचार करें, उदाहरण के लिए कम कैस लेटेंसी आपकी दीवार के समय में बड़ा बदलाव ला सकती है।
मार्क बूथ

4

आप मैट्रिक्स-वेक्टर को कैसे गुणा कर रहे हैं? हाथ से डबल लूप? या BLAS को कॉल? यदि आप MKL का उपयोग कर रहे हैं, तो मैं दृढ़ता से थ्रेडेड संस्करण के BLAS दिनचर्या का उपयोग करने की सलाह दूंगा।

जिज्ञासा से बाहर, आप भी की अपनी देखते संस्करण संकलित करने के लिए चाहते हो सकता है एटलस और कैसे यह आपकी समस्या पर करता है देखते हैं।

अपडेट करें

नीचे टिप्पणियों में चर्चा के बाद, यह पता चला है कि आपके इंटेल कोर i3-330M में केवल दो "असली" कोर हैं। हाइपरथ्रेडिंग के साथ दो लापता कोर का अनुकरण किया जाता है । चूँकि हाइपरथ्रेडेड कोर में मेमोरी बस और फ़्लोटिंग-पॉइंट दोनों इकाइयाँ साझा की जाती हैं, आप को कोई भी स्पीडअप नहीं मिलेगा यदि दोनों में से कोई एक सीमित कारक है। वास्तव में, चार कोर का उपयोग करना शायद चीजों को धीमा कर देगा।

"केवल" दो कोर पर आपको किस तरह के परिणाम मिलते हैं?


मैंने ATLAs, GoTo और Netlib BLAS की कोशिश की है। सभी प्रदर्शन में MKL से कमजोर हैं। क्या यह अपेक्षित है या मैं कुछ गलत कर रहा हूं? मैंने हैंडबुक में उल्लिखित ATLAS संकलित किया है। इसके अलावा, मैंने अपना (सटीक) कोड यहां पेस्ट किया है । इसकी कॉलिंग एमकेएल की बीएलएएस है।
inquest

ठीक है, और स्केलिंग के लिए, क्या आप सुनिश्चित हैं कि आपके आधार रेखा मामले में, कोड केवल एक ही सीपीयू पर चल रहा है? उदाहरण के लिए, यदि आप इसे बेंचमार्क करते हैं, तो क्या CPU उपयोग हिस्टोग्राम केवल एक कोर दिखाता है?
पेड्रो

हाँ। CPU हिस्टोग्राम 1 कोर दिखाता है।
इनक्वेस्ट

बस जिज्ञासा से बाहर, आपको दो या तीन कोर के लिए क्या मिलता है? क्या आपकी मशीन में वास्तव में चार शारीरिक कोर हैं, या हाइपरथ्रेडिंग के साथ सिर्फ दो कोर हैं ?
पेड्रो

मुझे यह कैसे पता चलेगा? मैंने अपने KMP_AFFINITY को मुख्य में शामिल किया है।
inquest

0

मुझे लगता है कि पंक्ति-प्रमुख ऑर्डरिंग इस समस्या के लिए मेमोरी एक्सेस समय, कैश लाइनों के उपयोग और टीएलबी की याद आती है। मुझे लगता है कि आपके FORTRAN संस्करण का उपयोग कॉलम-मेजर ऑर्डर करने के बजाय किया गया था, जो यह समझा सकता है कि यह C संस्करण की तुलना में लगातार धीमा क्यों है।

आप गति का परीक्षण भी कर सकते हैं यदि आप मैट्रिक्स वेक्टर गुणन के बजाय एक ही लूप में मैट्रिक्स के सभी तत्वों को जोड़ते हैं। (आप एक कारक 4 द्वारा लूप को अनियंत्रित करना चाह सकते हैं, क्योंकि इसके अलावा गैर-समरूपता कंपाइलर को आपके लिए यह अनुकूलन करने से रोक सकती है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.