ओपनसीएल में प्रतिलाभ की मनाही क्यों है?


19

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


2
GPU एक अलग तरीके से काम करता है। (कुछ आर्किटेक्चर) के पास वैश्विक "प्रोग्राम स्टैक" की अवधारणा नहीं है, इसलिए उन में पुनरावर्ती फ़ंक्शन कॉल संभव नहीं हैं। ओपनसीएल संभवत: सबसे कम आम भाजक को गोद लेती है, इस प्रकार यह पूरी तरह से जीपीयू में पोर्टेबल रहने के लिए अस्वीकार कर देता है। लगता है कि नए CUDA हार्डवेयर ने किसी बिंदु पर पुनरावृत्ति के लिए समर्थन शुरू किया है: stackoverflow.com/q/3644809/1198654
2

जवाबों:


27

यह अनिवार्य रूप से है क्योंकि सभी जीपीयू फ़ंक्शन कॉल का समर्थन नहीं कर सकते हैं- और भले ही वे कर सकते हैं, फ़ंक्शन कॉल काफी धीमी हो सकती हैं या बहुत छोटी स्टैक गहराई जैसी सीमाएं हो सकती हैं।

शेडर कोड और जीपीयू कंप्यूट कोड सभी स्थानों पर फ़ंक्शन कॉल के लिए दिखाई दे सकते हैं, लेकिन सामान्य परिस्थितियों में वे सभी 100% कंपाइलर द्वारा इनबिल्ड होते हैं। GPU द्वारा निष्पादित मशीन कोड में शाखाएं और लूप होते हैं, लेकिन कोई फ़ंक्शन कॉल नहीं करता है। हालाँकि, पुनरावर्ती फ़ंक्शन कॉल स्पष्ट कारणों के लिए इनलाइन नहीं हो सकते हैं। (जब तक कि कुछ दलीलें संकलन-समय स्थिरांक न हों, इस तरह से कि संकलक उन्हें मोड़ सकता है और कॉल के पूरे पेड़ को इनलाइन कर सकता है।)

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

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

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


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

पूंछ पुनरावृत्ति की तरह?
तन्मय पाटिल

आपको पूंछ पुनरावृत्ति करने के लिए एक स्टैक की आवश्यकता नहीं होगी, क्योंकि पूंछ-पुनरावर्ती कार्यों को पुनरावृत्ति कार्यों में परिवर्तित किया जा सकता है। क्या ओपनसीएल कंपाइलर स्वचालित रूप से ऐसा नहीं करता है?
एंडरसन ग्रीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.