cuda - क्या आपने सफलतापूर्वक एक जीपीपीयूयू इस्तेमाल किया है?




gpgpu hpc (7)

मुझे यह जानने में दिलचस्पी है कि क्या किसी ने एक आवेदन लिखा है जो कि किसी GPGPU का उपयोग करके लाभ लेता है, उदाहरण के लिए, nVidia CUDA । यदि हां, तो आपको एक मानक सीपीयू के मुकाबले आपको कौन सा मुद्दे मिलते हैं और आप किस प्रदर्शन को हासिल करते हैं?


मैं प्रसंस्करण के साथ जीपीजीपीयूयू का प्रयोग कर रहा हूं (मूल रूप से सीजी और अब सीयूडीए का उपयोग कर) और स्थिरीकरण (सीयूडीए का उपयोग कर)। मैं इन परिस्थितियों में 10-20X गति के बारे में मिल रहा हूं

मैंने जो पढ़ा है, उससे डेटा-समानांतर एल्गोरिदम के लिए यह काफी विशिष्ट है।


हालांकि मुझे सीयूडीए के साथ कोई व्यावहारिक अनुभव नहीं मिला है, मैं इस विषय का अध्ययन कर रहा हूं और कई सारे कागजात पाए हैं जो GPGPU APIs (वे सभी में CUDA शामिल हैं) का उपयोग करते हुए सकारात्मक परिणाम दर्ज करते हैं।

यह पत्र बताता है कि कैसे डेटाबेस में समानांतर प्राइमिटिव्स (मैप, स्कैटर, इकट्ठा आदि) की एक संख्या बनाकर पार्लल किया जा सकता है जो एक कुशल एल्गोरिदम में जोड़ सकते हैं।

इस पत्र में एईएस एन्क्रिप्शन मानक का एक समानांतर कार्यान्वयन बुद्धिमान एन्क्रिप्शन हार्डवेयर के लिए तुलनीय गति से किया गया है।

अंत में, यह पत्र विश्लेषण करता है कि सीयूडीए कितने आवेदनों पर लागू होता है जैसे संरचित और असंरचित ग्रिड, संयोजन तर्क, गतिशील प्रोग्रामिंग और डेटा खनन


मैंने कई इमेज प्रोसेसिंग एल्गोरिदम के लिए CUDA का इस्तेमाल किया है। ये अनुप्रयोग, बेशक, CUDA (या किसी GPU प्रोसेसिंग प्रतिमान के लिए) के लिए बहुत अनुकूल हैं

आईएमओ, सीयूडीए के एल्गोरिथम को पोर्ट करते समय तीन विशिष्ट चरणों होते हैं:

  1. प्रारंभिक पोर्टिंग: यहां तक ​​कि CUDA के बहुत ही बुनियादी ज्ञान के साथ, आप कुछ घंटों के भीतर सरल एल्गोरिदम बंद कर सकते हैं। यदि आप भाग्यशाली हैं, तो आपको प्रदर्शन में 2 से 10 का कारक मिलता है।
  2. तुच्छ ऑप्टिमाइज़ेशन: इसमें इनपुट डेटा और मल्टी-आयामी arrays के पैडिंग के लिए टेक्स्ट का उपयोग करना शामिल है। यदि आप अनुभव कर रहे हैं, यह एक दिन के भीतर किया जा सकता है और आपको प्रदर्शन में 10 का एक और पहलू दे सकता है। परिणामस्वरूप कोड अभी भी पठनीय है।
  3. हार्डकोर ऑप्टिमाइज़ेशन: इसमें साझा मेमोरी के लिए डेटा की प्रतिलिपि बनाने के लिए वैश्विक स्मृति विलंबता को रोकने के लिए, इस्तेमाल किए गए रजिस्टरों की संख्या को कम करने के लिए कोड को अंदर से बदलना आदि शामिल है। आप इस चरण के साथ कई हफ़्तों का खर्च कर सकते हैं, लेकिन प्रदर्शन लाभ वास्तव में इसके लायक नहीं है अधिकांश मामले। इस चरण के बाद, आपका कोड इतना अस्पष्ट होगा कि कोई इसे समझ नहीं सकता (आप सहित)।

यह सीपीयू के लिए कोड अनुकूलित करने के समान है। हालांकि, सीपीयू के मुकाबले प्रदर्शन ऑप्टिमाइजेशन के लिए जीपीयू की प्रतिक्रिया भी कम अनुमान लगाई गई है।


हाँ। मैंने सीयूडीए एपीआई का इस्तेमाल करते हुए गैर-लाइनर अनिसोट्रोपिक डिफ्यूजन फ़िल्टर को लागू किया है।

यह काफी आसान है, क्योंकि यह एक फिल्टर है जिसे समानांतर में इनपुट छवि दी गई है। मुझे इस पर कई कठिनाइयों का सामना नहीं करना पड़ा, क्योंकि इसके लिए सिर्फ एक साधारण कर्नेल आवश्यक था गति लगभग 300x थी यह सीएस पर मेरी अंतिम परियोजना थी इस परियोजना को यहां पाया जा सकता है (यह पुर्तगाली तू में लिखा है)।

मैंने ममफोर्ड और शाह सेगमेंट एल्गोरिथ्म भी लिखने की कोशिश की है, लेकिन यह लिखने में दर्द हो रहा है, क्योंकि सीयूडीए अभी शुरुआत में है और बहुत सी अजीब बातें होती हैं। मैंने कोड ओ_ओ में if (false){} जोड़कर एक प्रदर्शन में सुधार देखा है

इस सेगमेंट एल्गोरिदम के परिणाम अच्छे नहीं थे मेरे पास सीपीयू दृष्टिकोण की तुलना में 20x का प्रदर्शन नुकसान था (हालांकि, चूंकि यह एक सीपीयू है, एक अलग दृष्टिकोण जो उसी परिणाम को मिलाया जा सकता है)। यह अभी भी एक काम प्रगति पर है, लेकिन दुर्भाग्य से मैंने प्रयोगशाला को छोड़ दिया था, इसलिए शायद मैं इसे खत्म कर सकता हूं।


मैं सीयूडी के बजाय एटीआई स्ट्रीम एसडीके के साथ जीपीपीपीयू विकास कर रहा हूं। आप कितने प्रदर्शन लाभ प्राप्त करेंगे, कई कारकों पर निर्भर करता है, लेकिन सबसे महत्वपूर्ण संख्यात्मक तीव्रता है (यानी, गणना कार्यों के लिए मेमोरी संदर्भों का अनुपात।)

एक बैलस लेवल -1 या बीएलएस लेवल -2 फ़ंक्शन जैसे कि दो वैक्टर जोड़ना प्रत्येक 3 मेमोरी संदर्भों के लिए 1 मैथ ऑपरेशन करता है, इसलिए एनआई (1/3) है। यह हमेशा सीपीयू या कुदा के साथ धीमी गति से सीपीयू पर कर रहा है। मुख्य कारण यह है कि सीपीयू से डेटा को जीपीयू और पीठ पर स्थानांतरित करने का समय लगता है।

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

एक बीएलएएस स्तरीय -3 या एलएपीएके के लिए एक मैट्रिक्स की लू अपघटन की तरह फ़ंक्शन, या इसके ईगेंवल्यूज ढूँढने, ओ (एन ^ 3) कम्प्यूटेशंस और ओ (एन ^ 2) मेमोरी संदर्भ हैं, इसलिए एनआई हे ओ (एन) है। बहुत छोटे सरणियों के लिए, एन कुछ अंक है, यह अभी भी सीपीयू पर तेजी से काम करता है, लेकिन एन बढ़ जाती है, एल्गोरिथ्म बहुत तेजी से मेमरी-बाउंड से गणना करने के लिए जाता है और जीपीयू पर प्रदर्शन में वृद्धि बहुत बढ़ जाती है जल्दी जल्दी।

जटिल arithemetic शामिल कुछ भी स्केलर अंकगणितीय से अधिक computations है, जो आमतौर पर एनआई डबल्स और जीपीयू प्रदर्शन बढ़ जाती है।

http://home.earthlink.net/~mtie/CGEMM%20081121.gif

यहां सीजीईएमएम का प्रदर्शन - एक Radeon 4870 पर किया गया जटिल एकल परिशुद्धता मैट्रिक्स-मैट्रिक्स गुणा।


मैंने तुच्छ अनुप्रयोगों को लिखा है, यह वास्तव में मदद करता है यदि आप फ्लोटिंग प्वाइंट परिकलन को पूरा कर सकते हैं

मुझे इलिनोइस विश्वविद्यालय के Urbana Champaign प्रोफेसर और एक एनवीआईडीआईएआई इंजीनियर द्वारा निम्नलिखित पाठ्यक्रम को उखाड़ फेंका जब मैं शुरू हो रहा था: http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html ( सभी व्याख्यानों की रिकॉर्डिंग शामिल है)


मैंने एटीआई स्ट्रीम एसडीके का उपयोग करते हुए GPU पर बड़े रैखिक समीकरण को हल करने के लिए चोलस्की फैक्टराइजेशन लागू किया है I मेरी टिप्पणियां थीं

प्रदर्शन गति 10 गुना तक

एक ही समस्या पर इसे अधिक अनुकूलित करने के लिए कार्य करना, उसे कई जीपीयू में स्केल करके