समाधान
सप्टक अपने आप में एक एकल धागा अनुप्रयोग है कि एक कोर पर चलता है। आप एटीएलएएस जैसे कुछ पुस्तकालयों का उपयोग करने के लिए ऑक्टेट प्राप्त कर सकते हैं जो एकाधिक कोर का उपयोग करते हैं। इसलिए जब ओक्टेव केवल एक कोर का उपयोग करता है, जब आपको भारी ऑपरेशन होता है, तो ऑक्टेट कॉल एटीएलएएस में काम करता है जो कई सीपीयू का उपयोग करता है।
मैं ऐसा करने में सक्षम था। पहले स्रोत कोड से '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 अंडे देने के लिए संभव है:
एरिक के उत्तर की तरह, आप कई धागे का उपयोग करने के लिए इंटेल के मैथ कर्नेल पुस्तकालयों के साथ ऑक्टेव संकलित कर सकते हैं। एमकेएल गैर वाणिज्यिक उपयोग के लिए नि: शुल्क है। http://software.intel.com/en-us/articles/using-intel-mkl-in-gnu-octave – KevinC