2013-02-16 123 views
6

मैं समीकरण ए * एक्स = बी की गणना कर रहा हूं, जहां ए एक मैट्रिक्स है और बी एक वेक्टर है, एक्स उत्तर (अज्ञात) वेक्टर है।मैटलैब + सीयूडीए मैट्रिक्स-वेक्टर समीकरण को हल करने में धीमा ए * एक्स = बी

हार्डवेयर चश्मा: इंटेल i7 3630QM (4 कोर), nVidia GeForce जी.टी. 640m (384 CUDA कोर)

यहाँ एक उदाहरण है:

>> A=rand(5000); 

>> B=rand(5000,1); 

>> Agpu=gpuArray(A); 

>> Bgpu=gpuArray(B); 

>> tic;A\B;toc; 

Elapsed time is 1.382281 seconds. 

>> tic;Agpu\Bgpu;toc; 

Elapsed time is 4.775395 seconds. 

किसी तरह GPU बहुत धीमी है ... क्यों ? यह एफएफटी, आईएनवी, लू गणनाओं में भी धीमा है, जो मैट्रिक्स डिवीजन से संबंधित होना चाहिए।

हालांकि, GPU के बहुत तेजी से आव्यूह गुणन (एक ही डेटा) में है:

>> tic;A*B;toc; 

Elapsed time is 0.014700 seconds. 

>> tic;Agpu*Bgpu;toc; 

Elapsed time is 0.000505 seconds. 

मुख्य सवाल यह है कि क्यों GPU एक \ बी (mldivide) सीपीयू की तुलना में इतनी धीमी गति से है?

UPDATED यहां कुछ और परिणाम हैं जब ए, बी (CPU पर), ए.ए., बी बी (GPU पर) रैंड (5000) हैं:

>> tic;fft(A);toc; 
Elapsed time is *0.117189 *seconds. 
>> tic;fft(AA);toc; 
Elapsed time is 1.062969 seconds. 
>> tic;fft(AA);toc; 
Elapsed time is 0.542242 seconds. 
>> tic;fft(AA);toc; 
Elapsed time is *0.229773* seconds. 
>> tic;fft(AA);toc; 

बोल्ड बार स्थिर समय है। हालांकि जीपीयू लगभग दोगुना धीमा है। वैसे, जीपीयू पहले दो प्रयासों पर और धीमी क्यों है? क्या यह पहली बार दो बार संकलित है?

इसके अलावा:

>> tic;sin(A);toc; 
Elapsed time is *0.121008* seconds. 
>> tic;sin(AA);toc; 
Elapsed time is 0.020448 seconds. 
>> tic;sin(AA);toc; 
Elapsed time is 0.157209 seconds. 
>> tic;sin(AA);toc; 
Elapsed time is *0.000419 *seconds 

दो के बाद गणना GPU पाप गणना में अविश्वसनीय रूप से तेजी से होता है।

तो, फिर भी, क्यों जीपीयू मैट्रिक्स डिवीजन, एफएफटी और इसी तरह की गणना में इतनी धीमी है, हालांकि यह मैट्रिक्स गुणा और त्रिकोणमिति में इतनी तेज है? सवाल वास्तव में ऐसा नहीं होना चाहिए ... जीपीयू इन सभी गणनाओं में तेजी से होना चाहिए क्योंकि मैटलैब ने जीपीयू के लिए ओवरलैप्ड फ़ंक्शंस (एमएलडीआईवाइड, एफएफटी) जारी किया है।

क्या कोई मुझे इन मुद्दों को हल करने में मदद कर सकता है, कृपया? :)

+0

हालांकि यह सही स्थिति नहीं है क्योंकि आप क्रिलोव सबस्पेस विधि के बजाय प्रत्यक्ष सॉल्वर का उपयोग कर रहे हैं, बेंचमार्किंग के तहत वियनकेल साइट पर कुछ रोचक जानकारी है। यदि आप इसे देखें: http://viennacl.sourceforge.net/viennacl-benchmarks.html आप देखेंगे कि लगभग सभी स्थितियों में सीपीयू छोटे matrices के लिए gpu से तेज़ है, यह आंशिक रूप से प्रकृति की वजह से है पुनरावृत्त हलकों, लेकिन यह भी है कि वे "पीसीआई-एक्सप्रेस विलंबता के कारण अपरिहार्य GPU कर्नेल लॉन्च ओवरहेड" का परिणाम कहते हैं, जो आपके लिए समान प्रभाव डाल सकता है। – johnish

+0

@johnish मुझे यकीन नहीं है कि इस मामले में पीसीआई-एक्सप्रेस विलंबता के कारण लंबे समय तक GPU कर्नेल लॉन्च ओवरहेड के लिए निर्धारित किया जाना चाहिए। एक ही आकार के मैट्रिस के लिए, जीपीयू पर मैट्रिक्स गुणा 0.000505 लेता है, इसलिए मैं निष्कर्ष निकालूंगा कि ऐसा ओवरहेड <0.000505 एस है, जबकि एमएलडीवाइड 4.775395s लेता है। मैं निष्कर्ष निकालूंगा कि इस मामले में विलंबता पूरी तरह से प्रोसेसिंग समय से बाहर निकलती है जो कि "छोटे" मैट्रिक्स के लिए सीपीयू से अधिक हो सकती है, जैसा आपने देखा था। हाल ही में अनचाहे, Accelereyes जैकेट ने इस तरह के कार्यों के लिए एक अच्छा काम किया, लेकिन ऐसा लगता है कि यह अब Matlab में शामिल किया गया है। – JackOLantern

उत्तर

4

कृपया पढ़ें कि मैटलैब समाधानों की गणना कैसे करता है। यह आपको समझने में मदद करेगा कि जीपीयू धीमा क्यों है।

मैं इसे कुछ शब्दों में कहने की कोशिश करूंगा।

ए * एक्स = ख L * (यू * एक्स = y) = ख हो जाता है, L * यू = एक

  1. तो मैटलैब एल के लिए एक बनाता है * यू (यह प्रक्रिया पूरी तरह से समानांतर किया जा सकता है जहां तक ​​मुझे पता है कि कुछ कदम समानांतर किए जा सकते हैं, उनकी प्रकृति के कारण)
  2. फिर मैटलैब एल * वाई = बी हल करता है और y पाता है। (इस प्रक्रिया को समानांतर नहीं किया जा सकता है क्योंकि प्रत्येक चरण को पिछले से डेटा की आवश्यकता होती है)
  3. फिर मैटलैब U * x = y हल करता है और एक्स पाता है। (यह प्रक्रिया समानांतर नहीं किया जा सकता है के रूप में हर कदम पिछले से डेटा की आवश्यकता है)

तो यह GPU घड़ी सीपीयू की तुलना में धीमी है, और के बाद से प्रक्रियाओं समानांतर नहीं किया जा सकता, सीपीयू तेजी से होता है। और नहीं, जब तक कि आप एक बेहतर विधि (शुभकामनाएँ!) के साथ नहीं आते हैं, तो कुछ विशिष्ट मामलों को छोड़कर जीपीयू हमेशा धीमा रहेगा।

+0

यह ध्यान दिया जाना चाहिए कि 'mldivide' (कम से कम CPU संस्करण में) इनपुट मैट्रिक्स गुणों के आधार पर अलग निष्पादन पथ हैं। लेकिन एक सामान्य गैर-सममित गैर त्रिकोणीय वर्ग घने मैट्रिक्स के लिए, वास्तव में LU कारक का उपयोग किया जाता है: http://www.mathworks.com/support/solutions/en/data/1-172BD/index.html?product=ML&solution= 1-172BD – Amro

1

स्पष्टीकरण का भाग 1 उपयोगकर्ता 2230360 के उत्तर में है, लेकिन आपका प्रश्न दो गुना है, इसलिए मैं गुणा के बारे में थोड़ा सा जोड़ूंगा।

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