2012-08-09 33 views
17

मैं gnu octave के साथ एकाधिक थ्रेड प्रोग्राम करने में सक्षम होना चाहता हूं ताकि यह एकाधिक प्रोसेसर का उपयोग करेगा।एक मल्टीकोर प्रोसेसर के साथ काम करने के लिए जीएनयू ऑक्टेव प्राप्त करें। (मल्टीथ्रेडिंग)

मैं फेडोरा 17 लिनक्स पर जीएनयू सप्टक स्थापित किया है और निम्नलिखित किया:

yum install octave 

कौन सा सप्तक, 3.6.2 का नवीनतम संस्करण अपने कंप्यूटर पर स्थापित। यह बहुत अच्छा काम करता है, हालांकि जब आप दो विशाल मैट्रिक्स को गुणा करते हैं तो यह एक सीपीयू को दबा देता है जो ऑक्टेट का उपयोग करता है। यह अच्छा होगा अगर मैट्रिक्स गुणा सभी कोर का उपयोग करता है, क्योंकि इस मामले में सीपीयू स्पष्ट रूप से बाधा है।

क्या ऑक्टेट पूरी तरह से बहु-कोर प्रोसेसर का उपयोग कर सकते हैं और एकाधिक धागे पर चल सकते हैं? क्या इसके लिए कोई लाइब्रेरी या संकलन समय ध्वज है?

+0

एरिक के उत्तर की तरह, आप कई धागे का उपयोग करने के लिए इंटेल के मैथ कर्नेल पुस्तकालयों के साथ ऑक्टेव संकलित कर सकते हैं। एमकेएल गैर वाणिज्यिक उपयोग के लिए नि: शुल्क है। http://software.intel.com/en-us/articles/using-intel-mkl-in-gnu-octave – KevinC

उत्तर

24

समाधान

सप्टक अपने आप में एक एकल धागा अनुप्रयोग है कि एक कोर पर चलता है। आप एटीएलएएस जैसे कुछ पुस्तकालयों का उपयोग करने के लिए ऑक्टेट प्राप्त कर सकते हैं जो एकाधिक कोर का उपयोग करते हैं। इसलिए जब ओक्टेव केवल एक कोर का उपयोग करता है, जब आपको भारी ऑपरेशन होता है, तो ऑक्टेट कॉल एटीएलएएस में काम करता है जो कई सीपीयू का उपयोग करता है।

मैं ऐसा करने में सक्षम था। पहले स्रोत कोड से 'ATLAS' संकलित करें और इसे अपने सिस्टम में उपलब्ध कराएं ताकि ऑक्टेट इसे ढूंढ सके और उन लाइब्रेरी फ़ंक्शंस का उपयोग कर सके। एटलस स्वयं को आपके सिस्टम और कोर की संख्या में धुन देता है। जब आप स्रोत से ऑक्टेट को इंस्टॉल करते हैं और एटीएलएएस निर्दिष्ट करते हैं, तो यह इसका उपयोग करता है, इसलिए जब ऑक्टेट एक विशाल मैट्रिक्स गुणा की तरह भारी ऑपरेशन करता है, तो एटीएलएएस तय करता है कि कितने सीपीयू का उपयोग करना है।

मैं इसे फेडोरा के लिए काम करने में असमर्थ था, लेकिन जेनेटू पर मैं इसे काम करने के लिए प्राप्त कर सकता था।

मैं इन दो लिंक का प्रयोग किया: ftp://ftp.gnu.org/gnu/octave/

http://math-atlas.sourceforge.net/

मैंने पहले और एटलस के बाद निम्नलिखित सप्तक कोर भागा स्थापित:

tic 
bigMatrixA = rand(3000000,80); 
bigMatrixB = rand(80,30); 
bigMatrixC = bigMatrixA * bigMatrixB; 
toc 
disp("done"); 

आव्यूह गुणन बहुत तेजी से चला जाता है का उपयोग कर एकाधिक प्रोसेसर, जो एकल कोर के साथ पहले 3 गुना तेज था:

Without Atlas: Elapsed time is 3.22819 seconds. 
With Atlas: Elapsed time is 0.529 seconds. 

तीन पुस्तकालयों मैं उपयोग कर रहा हूँ जो गति चीजों को blas-atlas, cblas-atlas, lapack-atlas हैं।

अगर ऑक्टेट डिफ़ॉल्ट ब्लैस और लैपैक पुस्तकालयों के बजाय इनका उपयोग कर सकता है, तो यह बहु कोर का उपयोग करेगा।

यह आसान नहीं है और एटीएलएएस के साथ स्रोत से संकलित करने के लिए ऑक्टेट प्राप्त करने के लिए कुछ प्रोग्रामिंग कौशल लेता है।

Drabacks एटलस का उपयोग कर रहे हैं:

इस एटलस सॉफ्टवेयर से अधिक थ्रेड में अपने सप्तक कार्यक्रम विभाजित करने के लिए भूमि के ऊपर का एक बहुत उपयोग करता है। निश्चित रूप से यह बहुत तेज हो जाता है यदि आप जो भी कर रहे हैं वह विशाल मैट्रिक्स गुणा है, लेकिन अधिकांश आदेश एटलस द्वारा बहु-थ्रेड नहीं किए जा सकते हैं।यदि आपके कोर से प्रसंस्करण शक्ति/गति के हर बिट को निकालने की सर्वोच्च प्राथमिकता है तो आपके पास अपने प्रोग्राम को अपने साथ समानांतर में चलाने के लिए बहुत अच्छी किस्मत होगी। (अपने प्रोग्राम को 8 समकक्ष प्रोग्रामों में विभाजित करें जो समस्या के 1/8 वें स्थान पर काम करते हैं और सभी को एक साथ चलाते हैं, जब सभी किए जाते हैं, परिणामों को फिर से इकट्ठा करते हैं)।

एटलस एक थ्रेडेड ऑक्टेट प्रोग्राम को बहु-थ्रेडेड ऐप की तरह थोड़ा और व्यवहार करने में मदद करता है लेकिन यह कोई चांदी की बुलेट नहीं है। एटलस आपके एकल थ्रेडेड ऑक्टेव प्रोग्राम को आपके 2,4,6,8 कोर प्रोसेसर को अधिकतम नहीं करेगा। आपको एक प्रदर्शन बढ़ावा मिलेगा, लेकिन बढ़ावा आपको सभी प्रोसेसर का उपयोग करने के लिए एक बेहतर तरीका खोजने के लिए छोड़ देगा। इसका जवाब आपके प्रोग्राम को समानांतर में चलाने के लिए लिख रहा है, और इसमें बहुत सारे प्रोग्रामिंग कौशल होते हैं।

सुझाव

अपने सबसे भारी संचालन vectorizing और साथ-साथ प्रक्रिया वितरण एन एक साथ चल धागे में अपनी ऊर्जा रखो। यदि आप किसी प्रक्रिया को चलाने के लिए बहुत लंबा इंतजार कर रहे हैं, तो सबसे अधिक संभावना है कि इसे गति देने के लिए सबसे कम लटकने वाला फल अधिक कुशल एल्गोरिदम या डेटा संरचना का उपयोग कर रहा हो।

यह भी fork() समारोह का उपयोग कर subprocesses अंडे देने के लिए संभव है:

+0

"अपने प्रोग्राम को अलग थ्रेड में विभाजित करें" दृष्टिकोण के लिए, एक अनुकूलित बीएलएएस अभी भी वांछनीय है, लेकिन * एकल पिरोया *। इस [ओपनब्लैस अनुभाग] की तरह (http://wiki.octave.org/Octave_and_separate_toolchain)। फिर http://wiki.octave.org/Parallel_package में उदाहरण देखें – ederag

6

Octave-Forge पर समानांतर कंप्यूटिंग के साथ काम कर दो संकुल रहे हैं।

2

एरिक द्वारा सुझाए गए अनुसार मैंने ATLAS का उपयोग करने की कोशिश की और यह मेरे प्रदर्शन 3x (एनएन लर्निंग एप्लिकेशन में, मुख्य लागत मैट्रिक्स गुणा) में सुधार हुआ। आश्चर्य की बात है कि यह अभी भी केवल एक कोर का उपयोग करना प्रतीत होता था। आगे के शोध के बाद मैंने ओपनबीएलएस पर ठोकर खाई और बॉक्स के बाहर कई कोर का उपयोग करना शुरू किया और प्रदर्शन में 2 गुना सुधार किया (हालांकि मेरे पास केवल 2 कोर थे)। यदि आप अधिक निचोड़ना चाहते हैं तो आप एमकेएल का उपयोग करने का भी प्रयास कर सकते हैं, लेकिन यह निर्भरता के कारण डिस्क स्थान पर भारी है।

मैं संकुल समुदाय/atlas-lapack-base और aur/openblas-lapack के साथ आर्क लिनक्स का उपयोग कर रहा था। उनमें से प्रत्येक को स्थापित करने से ऑक्टेव में उपयोग किए गए डिफ़ॉल्ट को स्विच किया गया।

यहां उन पुस्तकालयों की तुलना में एक अच्छा बेंचमार्क है: http://www.tcm.phy.cam.ac.uk/~mjr/linpack/