लंबे पद के लिए क्षमा करें, लेकिन मैं वह सब कुछ शामिल करना चाहता था जो मैंने सोचा था कि पहली बार में प्रासंगिक था।
मैं क्या चाहता हूँ
मैं घने मैट्रिस के लिए क्रिलोव सबस्पेस मैथड्स के समानांतर संस्करण को लागू कर रहा हूं । मुख्य रूप से 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) कार्यान्वयन
- मैनुअल ट्यूनिंग (मुझे नहीं पता कि कैसे। यदि आप यह सुझाव देते हैं तो कृपया एक संसाधन की सिफारिश करें)
यदि किसी को अधिक (विशेष रूप से स्मृति के बारे में) विवरण की आवश्यकता है, तो कृपया मुझे बताएं कि मुझे क्या चलना चाहिए और कैसे। मैंने पहले कभी मेमोरी को प्रोफाईल नहीं किया।