छवि फ़िल्टरिंग के लिए पिक्सेल shader की तुलना में गणना योग्य shader कब अधिक कुशल होता है?


37

छवि फ़िल्टरिंग ऑपरेशन जैसे कि ब्लर्स, एसएसएओ, ब्लूम और इसके बाद आमतौर पर पिक्सेल शेड्स और "इकट्ठा" संचालन का उपयोग किया जाता है, जहां प्रत्येक पिक्सेल शेडर आह्वान पड़ोसी पिक्सेल मूल्यों का उपयोग करने के लिए कई बनावट के भ्रूण जारी करता है, और एक एकल पिक्सेल मूल्य की गणना करता है। परिणाम। इस दृष्टिकोण में एक सैद्धांतिक अक्षमता है कि कई निरर्थक भ्रूण किए जाते हैं: आस-पास के शेडर इनवोकेशन एक ही टेक्सल्स में से कई को फिर से प्राप्त करेंगे।

इसे करने का एक और तरीका कंप्यूटर्स शेड्स के साथ है। ये shader के इनवोकेशन के समूह में स्मृति की थोड़ी मात्रा साझा करने में सक्षम होने का संभावित लाभ है। उदाहरण के लिए, आप प्रत्येक आह्वान को एक टेक्सल ले सकते हैं और इसे साझा मेमोरी में स्टोर कर सकते हैं, फिर वहां से परिणामों की गणना कर सकते हैं। यह तेज हो सकता है या नहीं भी हो सकता है।

सवाल यह है कि किन परिस्थितियों में (यदि कभी हो) कंप्यूट-शेडर विधि वास्तव में पिक्सेल-शेडर विधि की तुलना में तेज है? क्या यह कर्नेल के आकार पर निर्भर करता है, यह किस प्रकार का फ़िल्टरिंग ऑपरेशन है, आदि? स्पष्ट रूप से उत्तर GPU के एक मॉडल से दूसरे में भिन्न होगा, लेकिन अगर कोई सामान्य रुझान है तो मैं सुनने में दिलचस्पी रखता हूं।


मुझे लगता है कि उत्तर "हमेशा" है यदि गणना शेडर ठीक से किया जाता है। यह प्राप्त करने के लिए तुच्छ नहीं है। एक संगणक shader भी इमेज प्रोसेसिंग एल्गोरिदम के लिए एक पिक्सेल shader की तुलना में एक बेहतर मेल है। एक पिक्सेल shader हालांकि कम प्रदर्शन प्रदान करता है जिसके साथ खराब प्रदर्शन करने वाले फ़िल्टर लिखे जाते हैं।
बर्नी

@bernie क्या आप स्पष्ट कर सकते हैं कि गणना करने वाले के लिए "ठीक से काम" करने के लिए क्या आवश्यक है? शायद एक उत्तर लिखें? हमेशा विषय पर अधिक दृष्टिकोण प्राप्त करने के लिए अच्छा है। :)
नाथन रीड

2
अब देखिए आपने मुझे क्या बना दिया! :)
bernie

थ्रेड्स में काम को साझा करने के अलावा, कंपकंपी शेडर्स का उपयोग करने के लिए एसिंक्स कंप्यूट का उपयोग करने की क्षमता एक बड़ा कारण है।
जार्कोएल

जवाबों:


23

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

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

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

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


मुझे गंभीरता से संदेह है कि आरओपी किसी भी प्रदर्शन को उपरि जोड़ता है यदि सम्मिश्रण अक्षम है।
ग्रोवरमैनहेम

@GroverManheim वास्तुकला पर निर्भर करता है! आउटपुट मर्जर / ROP स्टेप को भी ब्लेंडिंग डिसेबल होने पर भी ऑर्डर की गारंटी से निपटना पड़ता है। एक फुल-स्क्रीन त्रिकोण के साथ कोई वास्तविक आदेश देने वाले खतरे नहीं हैं, लेकिन हार्डवेयर को यह पता नहीं हो सकता है। हार्डवेयर में विशेष तेज़ पथ हो सकते हैं, लेकिन कुछ के लिए यह जानना कि आप उनके लिए योग्य हैं ...
जॉन कॉल्सबेक

10

जॉन ने पहले से ही एक महान उत्तर लिखा है, इसलिए इस उत्तर को उसके विस्तार पर विचार करें।

मैं वर्तमान में अलग-अलग एल्गोरिदम के लिए गणना शेड के साथ बहुत काम कर रहा हूं। सामान्य तौर पर, मैंने पाया है कि गणना करने वाले शेड उनके समकक्ष पिक्सेल shader या प्रतिक्रिया आधारित विकल्पों को बदलने की तुलना में बहुत तेज़ हो सकते हैं।

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

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

कंप्यूट शेड्स का उपयोग करते समय, GPU पर अधिक सिलिकॉन का उपयोग वास्तविक कार्य करने के लिए किया जा सकता है। पिक्सेल shader मार्ग का उपयोग करते समय इन सभी अतिरिक्त चरणों की आवश्यकता होती है:

  • वर्टेक्स असेंबली (वर्टेक्स एट्रिब्यूट्स, वर्टेक्स डिवाइडर, टाइप कन्वर्सेशन को पढ़ते हुए, उन्हें vec4 तक फैलाना, आदि)
  • शीर्ष शेडर को निर्धारित करने की आवश्यकता है कि वह कितना कम से कम हो
  • रेखापुंज को पिक्सेल की सूची को छायांकित करने और वर्टेक्स आउटपुट को प्रक्षेपित करने के लिए गणना करना है (शायद छवि के केवल बनावट कोर्ड्स)
  • सभी अलग-अलग राज्यों (गहराई परीक्षण, अल्फा परीक्षण, कैंची, सम्मिश्रण) को सेट और प्रबंधित करना होगा

आप तर्क दे सकते हैं कि पहले से उल्लेख किए गए सभी प्रदर्शन फायदे एक स्मार्ट ड्राइवर द्वारा नकार दिए जा सकते हैं। आप सही होंगे। ऐसा ड्राइवर यह पहचान सकता है कि आप गहराई परीक्षण आदि के बिना एक फुल-स्क्रीन क्वाड का प्रतिपादन कर रहे हैं और "फास्ट पथ" को कॉन्फ़िगर करें जो पिक्सेल शेड्स का समर्थन करने के लिए किए गए सभी बेकार काम को रोक देता है। मुझे आश्चर्य नहीं होगा अगर कुछ ड्राइवर अपने विशिष्ट GPU के लिए कुछ AAA गेम में पोस्ट-प्रोसेसिंग पास को तेज करने के लिए ऐसा करते हैं। आप निश्चित रूप से ऐसे किसी भी उपचार के बारे में भूल सकते हैं यदि आप एएए गेम पर काम नहीं कर रहे हैं।

हालांकि ड्राइवर जो नहीं कर सकता है वह कंप्‍यूटर शेडर पाइपलाइन द्वारा पेश किए गए बेहतर समानतावाद अवसर हैं। एक गाऊसी फिल्टर का क्लासिक उदाहरण लें। कंप्यूट शेड्स का उपयोग करके, आप ऐसा कुछ कर सकते हैं (फ़िल्टर को अलग करना या नहीं करना):

  1. प्रत्येक कार्य समूह के लिए, स्रोत छवि के नमूने को कार्य समूह के आकार में विभाजित करें और परिणामों को समूह साझा मेमोरी में संग्रहीत करें।
  2. साझा मेमोरी में संग्रहीत नमूना परिणामों का उपयोग करके फ़िल्टर आउटपुट की गणना करें।
  3. आउटपुट बनावट में लिखें

चरण 1 यहाँ कुंजी है। पिक्सेल shader संस्करण में, स्रोत छवि प्रति पिक्सेल कई बार नमूना की जाती है। गणना shader संस्करण में, प्रत्येक स्रोत टेक्सल को केवल एक बार एक कार्य समूह के अंदर पढ़ा जाता है। बनावट पढ़ता है आमतौर पर एक टाइल-आधारित कैश का उपयोग करते हैं, लेकिन साझा स्मृति की तुलना में यह कैश अभी भी बहुत धीमा है।

गाऊसी फ़िल्टर सरल उदाहरणों में से एक है। अन्य फ़िल्टरिंग एल्गोरिदम साझा मेमोरी का उपयोग करके कार्य समूहों के अंदर मध्यस्थ परिणामों को साझा करने के लिए अन्य अवसर प्रदान करते हैं।

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

संदर्भ


3

मैं इस ब्लॉग पर ठोकर खाई: एएमडी के लिए कंपेयर शेड ऑप्टिमाइज़ेशन

यह देखते हुए कि गणना shader में क्या चालें की जा सकती हैं (जो केवल shaders की गणना करने के लिए विशिष्ट हैं) मैं उत्सुक था यदि गणना shader पर समानांतर कमी पिक्सेल shader की तुलना में तेज थी। मैंने लेखक, वुल्फ एंगेल को यह बताने के लिए ई-मेल किया कि क्या उन्होंने पिक्सेल शेडर की कोशिश की थी। उन्होंने उत्तर दिया कि जब उन्होंने ब्लॉग पोस्ट लिखी थी तब हाँ और वापस, कंपकंपी शेडर संस्करण पिक्सेल shader संस्करण की तुलना में काफी तेज था। उन्होंने यह भी कहा कि आज मतभेद और भी बड़े हैं। तो जाहिरा तौर पर ऐसे मामले हैं जहां गणना shader का उपयोग करने से बहुत फायदा हो सकता है।

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