कंप्यूटर्स बनाम पाइपलाइन शेड्स के माध्यम से एल्गोरिदम को लागू करना


10

DirectX और OpenGL दोनों के लिए कंप्यूट शेड्स की उपलब्धता के साथ, अब यह संभव है कि समस्या निवारण के लिए GPU के पाइपलाइन पर जाने के बजाय कई एल्गोरिदम को लागू किया जाए और इसके बजाय सामान्य प्रयोजन कंप्यूटिंग का उपयोग किया जाए।

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

एक एल्गोरिथ्म को देखते हुए, जो दोनों तरीकों से लागू किया जा सकता है, क्या गणना मार्ग का उपयोग करके सामान्य मार्ग पर जाने के लिए सामान्य (संभावित) प्रदर्शन लाभ हैं? क्या ऐसी कमियां हैं, जिनके लिए हमें बाहर देखना चाहिए (उदाहरण के लिए, क्या रन-वे पर गणना करने के लिए / से गणना करने के लिए किसी प्रकार का असामान्य ओवरहेड है)?

क्या दोनों के बीच चयन करने पर विचार करने के लिए शायद अन्य लाभ या कमियां हैं?


यदि प्रदर्शन टैग वास्तव में प्रासंगिक है, तो मार्को फ्रैटरकैंगेली से गेम इंजन रत्न "क्लॉथ सिमुलेशन" लेख के इस वीडियो को देखने पर विचार करें : youtube.com/watch?v=anNClcux4JQ । आप टिप्पणियों को पढ़ सकते हैं और एक अजीब बात का पता लगा सकते हैं: GLSL / shader आधारित कार्यान्वयन CUDA या OpenCL (बाद में खराब ड्राइवर समर्थन के कारण बाद में, 2010 में) का उपयोग करने की तुलना में तेज़ था। कुछ निम्न-स्तर के अंतर हैं जो एक अंतर बनाते हैं।
तेओद्रोन

@teodron मेरे पास GPU रत्न उपलब्ध नहीं है और मुझे स्रोत कोड नहीं मिल रहा है। क्या लेखक वास्तव में GLSL वर्टेक्स + पिक्सेल शेड्स का उपयोग करता है या उसने GLSL कंप्यूट शेड्स का उपयोग किया है?
ट्रैविसग

हाँ! CUDA से पहले, इस तरह से समुदाय ने GPGPU सुविधाओं को लागू किया। यहाँ ओपनक्लोथ का लिंक दिया गया है कि कोई व्यक्ति केवल शुद्ध GLSL या Cuda का उपयोग करके कैसे प्राप्त कर सकता है: code.google.com/p/opencloth/source/browse/trunk/…
teodron

जवाबों:


7

कोई सही उत्तर नहीं है अगर आप सीधे गणना करने वाले shadrs / GPGPU appraoch से लाभान्वित होने जा रहे हैं, यह आपके द्वारा लागू किए जाने वाले एल्गोरिथ्म के प्रकार पर अत्यधिक निर्भर है, कंप्यूटर्स और CUDA / OpenCL कुछ सीमाओं को पार करने के लिए एक अधिक सामान्य दृष्टिकोण है। उन पुरानी छायांकन भाषाओं की हैकिंग। सबसे महत्वपूर्ण लाभ आपको मिलेगा:

  • स्थानिक जानकारी तक पहुँचना। पुराने GLSL हैक (ठीक है, यह एक हैक था!) ​​केवल बनावट के निर्देशांक का उपयोग करने के बाद से पड़ोसी टुकड़े के बारे में बहुत कम जानकारी देता है। कंप्यूट शेडर्स / CUDA / ओपनसीएल एक्सेसिंग में स्थानिक जानकारी बहुत अधिक लचीली है, अब आप अन-ऑर्डर किए गए बनावट / बफर एक्सेस के साथ GPU पर हिस्टोग्राम समीकरण जैसे एल्गोरिदम को लागू करने में सक्षम हैं ।
  • आपको थ्रेड सिंक्रोनाइज़ेशन और एटमिक्स देता है ।
  • कंप्यूट स्पेस: पुराने जीएलएसएल हैक हार्डर / टुकड़ा गणना स्थान को आपके शेडर में हार्ड-वायर कर देगा। टुकड़ा shader टुकड़े की संख्या के साथ चलेगा, शीर्ष shader कोने की संख्या के साथ चलेगा। गणना shader में आप अपने खुद के स्थान को परिभाषित करते हैं।
  • अनुमापकता : आपकी गणना shader / CUDA / OpenCL आपके पुराने GLSL शेडर के विपरीत उपलब्ध GPU SMs (स्ट्रीमिंग मल्टीप्रोसेसर) की संख्या को बढ़ा सकती है जिसे उसी SM पर निष्पादित किया जाना चाहिए। (नाथन रीड की टिप्पणियों के आधार पर वह कहते हैं कि यह सच नहीं है, और शेड्स को स्केल के रूप में अच्छे होने चाहिए, क्योंकि मुझे अभी भी यकीन नहीं है कि मुझे दस्तावेज़ की जांच करने की आवश्यकता है)।
  • संदर्भ स्विचिंग : कुछ संदर्भ स्विचिंग होना चाहिए, लेकिन मैं कहूंगा कि आवेदन पर निर्भर करता है इसलिए आपका सबसे अच्छा शर्त आपके आवेदन को प्रोफाइल करना है।

खैर में मेरी राय में, यदि आप गणना shaders करना चाहते हैं, भले ही कुछ एल्गोरिदम अधिक उपयुक्त हो सकता है चाहता हूँ, वहाँ कुछ कारणों से आप को ध्यान में रखना करने की आवश्यकता है:

  1. हार्डवेयर और पिछड़े संगतता । कंप्यूट शेडर्स केवल नए हार्डवेयर में उपलब्ध हैं और यदि आप किसी व्यावसायिक उत्पाद (जैसे गेम) के लिए जा रहे हैं, तो आपको यह उम्मीद करने की आवश्यकता है कि बहुत सारे उपयोगकर्ता आपके उत्पाद को चलाने में सक्षम नहीं हो सकते हैं।
  2. आपको आमतौर पर GPU / CPU आर्किटेक्चर , समानांतर प्रोग्रामिंग और मल्टीथ्रेडिंग (जैसे मेमोरी शेयरिंग, मेमोरी कोहेरेंसी, थ्रेड सिंक्रोनाइज़ेशन, एटॉमिक्स और इसके प्रदर्शन पर प्रभाव पड़ता है) में अतिरिक्त ज्ञान की आवश्यकता होती है , जो कि आपको आमतौर पर सामान्य शेड्स राउट का उपयोग करने की आवश्यकता नहीं होती है ।
  3. सीखने के संसाधन , अनुभव से लेकर सामान्य shaders मार्ग की तुलना में Compute shadrs, OpenCL और CUDA (जो OpenGL इंटरऑपरेबिलिटी भी प्रदान करते हैं) के लिए बहुत कम सीखने के संसाधन हैं।
  4. डिबगिंग टूल , उचित डिबगिंग की कमी के साथ, उपकरण विकास अधिकांश शेड्स की तुलना में बहुत कठिन हो सकता है, कम से कम शेड्स नेत्रहीन रूप से डिबग किए जा सकते हैं।
  5. मैं अन्य रंगों में समान एल्गोरिथ्म की तुलना में बेहतर प्रदर्शन देने के लिए कंप्यूट शेयर्स की उम्मीद करता हूं; यदि वे बिंदु 2 से सही बातों को ध्यान में रखते हुए किए गए थे, क्योंकि वे ग्राफिक्स रेंडरिंग के अतिरिक्त चरणों से बचने के लिए डिज़ाइन किए गए थे। लेकिन मेरे पास अपने दावे का समर्थन करने के लिए कोई ठोस सबूत नहीं है।
  6. यदि आप उस मार्ग से जा रहे हैं तो आपको GPGPU के लिए CUUDA / OpenCL पर भी विचार करना चाहिए।

कभी नहीं कम मुझे यकीन है कि यह भविष्य के लिए बहुत अच्छा है, और सीखने का शानदार अनुभव होगा। शुभ लाभ!


मुझे लगता है कि ओपी यह पूछ रहा हो सकता है: शुद्ध जीएलएसएल शेड्स बनाम कोडा में कोडिंग का उपयोग करके एक समस्या का समाधान क्यों? वहाँ एक खेल प्रोग्रामिंग रत्न लेख कपड़ा सिमुलेशन से संबंधित है, जहां लेखक बस यही करता है। और GLSL हैकी पुराना तरीका प्रदर्शन के मामले में CUDA तरीके से बेहतर है। आपको शायद यह इंगित करना चाहिए कि यदि आपके पास कोई विचार है तो क्यों।
तेओद्रोन

2
मुझे नहीं लगता कि आपका स्केलेबिलिटी पॉइंट सही है - वर्टेक्स और फ्रैगमेंट शेड्स पूरे जीपीयू को स्केल करने में सक्षम हैं जैसे कि कंप्यूट शेड्स हैं। वास्तव में गणना करने वाले शेड्स को स्केल करना अधिक कठिन हो सकता है, क्योंकि थ्रेडग्रुप आकार और साझा मेमोरी उपयोग एक समय में कितने शेडर थ्रेड चल सकते हैं, इस पर अतिरिक्त सीमाएं लगा सकते हैं।
नाथन रीड 8

2
इसके अलावा, यदि आप किसी बनावट को आबाद कर रहे हैं (जैसे शोर पैदा करना या कुछ अन्य प्रक्रियात्मक एल्गोरिथ्म करना), तो मेरे अनुभव में एक टुकड़ा shader एक कंपकंपी shader की तुलना में तेज़ होगा यदि आप बस प्रत्येक पिक्सेल पर एक सूत्र का मूल्यांकन कर रहे हैं। मेरा अनुमान है कि यह इसलिए है क्योंकि टुकड़े का ऑर्डर आंतरिक टाइल वाले / स्विज़ल्ड पिक्सेल ऑर्डर से मेल खाता है, इस प्रकार इस आदेश से अनजान कंपाउंडर शेडर की तुलना में बेहतर मेमोरी लोकलिटी मिल रही है। गणना शेड्स केवल तभी तेज होते हैं जब आप किसी विशेष चीज़ का उपयोग कर सकते हैं, उदाहरण के लिए साझा की गई मेमोरी, टुकड़े टुकड़े करने वाले के सापेक्ष बहुत अधिक गति देने के लिए।
नाथन रीड

2
ठीक है, अंतिम टिप्पणी :) मुझे लगता है कि ग्राफिक्स से गणना करने और इसके विपरीत जाने पर अधिकांश वर्तमान जीपीयू में कुछ प्रकार के संदर्भ स्विच या मोड स्विच होते हैं। इसलिए यदि आप कुछ ग्राफिक्स शेड्स चलाते हैं, तो एक गणना शेडर को भेजें, फिर कुछ और ग्राफिक्स शेड्स चलाएं, आप आगे और पीछे स्विच करते समय कुछ प्रदर्शन हिट कर रहे हैं। यह ऐसा कुछ है जिसे आपको प्रोफ़ाइल करना होगा, लेकिन यह एक विशेष मामले में ग्राफिक्स शेड के साथ चिपके रहने का एक और कारण हो सकता है।
नाथन रीड

@NathanReed टिप्पणियों के लिए धन्यवाद मैं अपना जवाब अपडेट करूंगा।
कॉन्सेप्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.