GPU प्रोग्रामिंग के लिए जोर


10

मैं GPGPU प्रोग्रामिंग के लिए बहुत नया हूं, इसलिए कृपया मुझे क्षमा करें यदि प्रश्न विशेष रूप से उपयुक्त नहीं है। सामान्य सीपीयू प्रोग्रामिंग की तुलना में जब मुझे समझ में आता है कि GPU प्रोग्रामिंग, इंजीनियरिंग कार्य का एक बहुत जटिल टुकड़ा है। विचलन मुद्दों, टाइलिंग, पिन किए गए मेमोरी आवंटन, और होस्ट-डिवाइस संचार / डिवाइस गणना ओवरलैपिंग के बारे में बहुत सावधान रहना होगा।

थोड़ी खोजबीन करने के बाद मुझे थ्रू लाइब्रेरी मिली, जो लगता है कि C ++ STL की नकल करने की कोशिश है। यह काफी अच्छा है। हालांकि, मेरे बहुत ही सीमित अनुभव के आधार पर और अच्छा प्रदर्शन पाने के लिए आवश्यक सभी सूक्ष्म प्रबंधन को देखकर, मुझे प्रदर्शन के बारे में थोड़ा संदेह है। जोर से कुशलता से सभी जटिल प्रोग्रामिंग भाग को आंतरिक रूप से संभाल सकते हैं? कुछ बहुत प्रसिद्ध पुस्तकालय, जैसे पेट्सक, इस पैकेज का उपयोग करते हैं जो मुझे विश्वास दिलाता है कि यह किसी भी तरह से होना चाहिए।

मैं सोच रहा था कि CUDA और थ्रस्ट पर अधिक अनुभव वाले लोग निम्न स्तर के CUDA प्रोग्रामिंग की तुलना में पैकेज के प्रदर्शन के बारे में एक या दो शब्द कह सकते हैं। मैं थ्रस्ट का उपयोग कब कर सकता हूं और कब CUDA पर वापस जाना चाहिए?


क्या आपने ArrayFire पर विचार किया है?
21

जवाबों:


2

मेरे पास जोर के साथ व्यक्तिगत अनुभव नहीं है, लेकिन मैं वियनाएलसीएल का उपयोग करता हूं, जो एक अन्य उच्च स्तरीय जीपीयू लाइब्रेरी है जो लगभग सभी विवरणों को छुपाता है। अपने स्वयं के व्यक्तिगत बेंचमार्किंग से मैं वास्तविक गणना पर 2x - 40x की गति-अप देख सकता हूं यदि आप उस समय को अनदेखा करते हैं जो स्मृति के चारों ओर जाने में समय लेता है।

जब आपको CPU बनाम थ्रस्ट बनाम CUDA का उपयोग करना चाहिए, यह सब उस समस्या पर निर्भर करता है जिसे आप हल कर रहे हैं, आपका कौशल और आपके पास उपलब्ध समय। मैं उनके सापेक्ष प्रदर्शन को देखने के लिए सभी 3 विधियों के साथ सरल समस्याओं को हल करके शुरू करने की सलाह दूंगा। फिर आप अपने वास्तविक सॉफ़्टवेयर को त्वरित तरीके से लिख सकते हैं, इसे बेंचमार्क कर सकते हैं, और उन क्षेत्रों में उपयुक्त gpu विधि लागू कर सकते हैं, जिन्हें स्पीड-अप की आवश्यकता है, न कि CUDA सॉफ़्टवेयर को लिखने में आपका समय बर्बाद करने से, जो आपको निष्पादन के कुछ मिनटों में लाभ देगा। ।


यह मेरे लिए एकदम सही समझ में आता है। एक को हमेशा पहले प्रोफाइल करना होता है। तो आपके उदाहरण में, आपको जो स्पीडअप मिला है, वह वियनाक्ल का उपयोग करने से था। क्या आपने अंतर की जांच के लिए डायरेक्ट ओपनसीएल की कोशिश की है?
mmirzadeh

नहीं, आप की तरह मैं GPU कंप्यूटिंग के लिए नया हूं। मैं अगले साल या दो साल के लिए CUDA और OpenCL को शामिल करने के लिए धीरे-धीरे अपने कौशल का विस्तार करने की योजना बना रहा हूं, लेकिन वर्तमान में मैं केवल पुस्तकालय का उपयोग करता हूं। वियनाक्ल के प्रलेखन में कहा गया है कि आगे की गति एक ट्यून किए गए ओपनएलसी कार्यान्वयन के साथ संभव होगी जो संभवतः एक और 2x-10x के आदेश पर होगी, हालांकि मैंने सीखा है कि मेमोरी बैंडविड्थ कमरे में 900 पाउंड गोरिल्ला है जो वास्तव में उनके प्रदर्शन को परिभाषित करता है।
गोड्रिक सीर

5

मैंने अपने लिंक्ड क्लस्टर विस्तार परियोजना में थ्रस्ट का उपयोग किया है। स्थिति के आधार पर, थ्रस्ट निम्न स्तर के क्रियान्वयन से बेहतर या बेहतर प्रदर्शन कर सकता है जिसे आप स्वयं रोल करते हैं (विशेष रूप से, reduceकर्नेल मेरे लिए काफी अच्छा काम कर रहा है)। हालांकि थ्रस्ट की सामान्य प्रकृति और लचीलेपन का मतलब है कि इसे कभी-कभी बहुत अधिक अतिरिक्त नकल, सरणी पैडिंग आदि करना पड़ता है, जो इसे कुछ बुरा किनारा मामलों में काफी कम कर सकता है। पिछली बार मैंने इसका उपयोग sortअन्य पुस्तकालयों जैसे बी 40 सी या एमजीपीयू की तुलना में काफी धीमा था। हालाँकि, NVIDIA थ्रस्ट के एल्गोरिथम प्रदर्शन को बेहतर बनाने पर काम कर रहा है ताकि भविष्य में यह कम हो सके।

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


3

जोर का उद्देश्य (अधिकांश टेम्पलेट पुस्तकालयों के रूप में) एक उच्च-स्तरीय अमूर्तता प्रदान करना है, जबकि अच्छा या उत्कृष्ट प्रदर्शन करते हुए संरक्षण करना।

मैं सुझाव दूंगा कि प्रदर्शन को लेकर ज्यादा चिंता न करें, लेकिन खुद से पूछें कि क्या

  • आपके आवेदन को जोर में लागू किए गए एल्गोरिदम के संदर्भ में वर्णित किया जा सकता है, और यदि

  • आपको दिए गए हार्डवेयर / सॉफ्टवेयर आर्किटेक्चर के लिए एक कुशल मैपिंग खोजने के लिए आवश्यक विवरणों के बिना "जेनेरिक" समानांतर कोड लिखने की संभावना पसंद है।

यदि आप दोनों प्रश्नों का सकारात्मक उत्तर देते हैं तो आपको CUDA के कार्यान्वयन के संबंध में कम प्रयास के साथ अपने कार्यक्रम को लागू करने में सक्षम होना चाहिए। फिर आप अपने आवेदन को प्रोफाइल कर सकते हैं और यह तय कर सकते हैं कि प्रदर्शन में सुधार करने की कोशिश करना उचित है या नहीं।

इसने कहा, मुझे यह स्वीकार करना होगा कि मुझे "जेनेरिक" प्रोग्रामिंग पसंद नहीं है, क्योंकि मैं कुछ नया सीखने को तैयार हूं, जब मैं एक कार्यक्रम लिखता हूं। मैं एक और मार्ग का पालन करूंगा: अजगर + सुन्न + स्काइप में एक प्रोटोटाइप कार्यान्वयन लिखें, फिर उन 1% के लिए CUDA कर्नेल जोड़ें - कोड का 2% जो वास्तव में अनुकूलन की आवश्यकता है और एक GPU पर चलाने के लिए उपयुक्त है। निश्चित रूप से ऐसा करने से आपको किसी प्रकार के पूर्व-विज्ञान की आवश्यकता होती है, क्योंकि प्रोटोटाइप चरण में एक गलत निर्णय (उदाहरण के लिए CUDA कर्नेल के लिए अनुपयुक्त डेटा संरचना) के प्रदर्शन पर भयानक परिणाम हो सकते हैं। आमतौर पर एक अच्छा कोड प्राप्त करने के लिए अधिक पुनरावृत्तियों की आवश्यकता होती है और जोर से बेहतर करने का कोई आश्वासन नहीं होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.