मैं समीकरण ए * एक्स = बी की गणना कर रहा हूं, जहां ए एक मैट्रिक्स है और बी एक वेक्टर है, एक्स उत्तर (अज्ञात) वेक्टर है।मैटलैब + सीयूडीए मैट्रिक्स-वेक्टर समीकरण को हल करने में धीमा ए * एक्स = बी
हार्डवेयर चश्मा: इंटेल 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 पाप गणना में अविश्वसनीय रूप से तेजी से होता है।
तो, फिर भी, क्यों जीपीयू मैट्रिक्स डिवीजन, एफएफटी और इसी तरह की गणना में इतनी धीमी है, हालांकि यह मैट्रिक्स गुणा और त्रिकोणमिति में इतनी तेज है? सवाल वास्तव में ऐसा नहीं होना चाहिए ... जीपीयू इन सभी गणनाओं में तेजी से होना चाहिए क्योंकि मैटलैब ने जीपीयू के लिए ओवरलैप्ड फ़ंक्शंस (एमएलडीआईवाइड, एफएफटी) जारी किया है।
क्या कोई मुझे इन मुद्दों को हल करने में मदद कर सकता है, कृपया? :)
हालांकि यह सही स्थिति नहीं है क्योंकि आप क्रिलोव सबस्पेस विधि के बजाय प्रत्यक्ष सॉल्वर का उपयोग कर रहे हैं, बेंचमार्किंग के तहत वियनकेल साइट पर कुछ रोचक जानकारी है। यदि आप इसे देखें: http://viennacl.sourceforge.net/viennacl-benchmarks.html आप देखेंगे कि लगभग सभी स्थितियों में सीपीयू छोटे matrices के लिए gpu से तेज़ है, यह आंशिक रूप से प्रकृति की वजह से है पुनरावृत्त हलकों, लेकिन यह भी है कि वे "पीसीआई-एक्सप्रेस विलंबता के कारण अपरिहार्य GPU कर्नेल लॉन्च ओवरहेड" का परिणाम कहते हैं, जो आपके लिए समान प्रभाव डाल सकता है। – johnish
@johnish मुझे यकीन नहीं है कि इस मामले में पीसीआई-एक्सप्रेस विलंबता के कारण लंबे समय तक GPU कर्नेल लॉन्च ओवरहेड के लिए निर्धारित किया जाना चाहिए। एक ही आकार के मैट्रिस के लिए, जीपीयू पर मैट्रिक्स गुणा 0.000505 लेता है, इसलिए मैं निष्कर्ष निकालूंगा कि ऐसा ओवरहेड <0.000505 एस है, जबकि एमएलडीवाइड 4.775395s लेता है। मैं निष्कर्ष निकालूंगा कि इस मामले में विलंबता पूरी तरह से प्रोसेसिंग समय से बाहर निकलती है जो कि "छोटे" मैट्रिक्स के लिए सीपीयू से अधिक हो सकती है, जैसा आपने देखा था। हाल ही में अनचाहे, Accelereyes जैकेट ने इस तरह के कार्यों के लिए एक अच्छा काम किया, लेकिन ऐसा लगता है कि यह अब Matlab में शामिल किया गया है। – JackOLantern