2012-04-26 18 views
5

में लूप को अनदेखा करना रोकें मैं क्रोम (और फ़ायरफ़ॉक्स) के नवीनतम संस्करण का उपयोग कर वेबजीएल (जीएलएसएल ईएस 1.0) के लिए एक टुकड़ा शेडर लिख रहा हूं, और मैंने एक पुनरावृत्त एल्गोरिदम लिखा है।टुकड़े टुकड़े

तो सबसे पहले, मुझे मुश्किल तरीका पता चला कि लूप की लंबाई काफी प्रतिबंधित है (डॉक्टर कहते हैं कि यह संकलन-समय पर अनुमान लगाया जाना चाहिए, जिसका अर्थ है कि यह स्थिर या बहुत करीब होना चाहिए)।

इसके अलावा, मैं एक लिखना चाहिए (for, क्योंकि यह केवल एक ही है जो मानक के अनुसार लागू किया जाना चाहिए है) पाश संभावित लंबी है कि लेकिन वह अंत से पहले लगभग हर बार टूट जाता है।

अब, मैंने देखा है कि यदि मैंने उच्चतम संख्या निर्धारित की है तो शेडर का संकलन और लिंकिंग अधिक समय लेता है। इसलिए, जब तक कि मैं गलत नहीं हूं, संकलक लूप को अनदेखा करता है।

मुझे यकीन नहीं है कि कुछ भी किया जा सकता है, लेकिन मैंने कुछ चीजों की कोशिश की है और संकलक इनलाइन कार्यों को भी लगता है, भले ही लूप में बुलाया जाता है।

मुझे लगता है कि एक शेडर के लिए एक लूप के लगभग सौ पुनरावृत्तियों के लिए संकलन करने के लिए पूरे मिनट लेने के लिए सामान्य नहीं लगता है। या मैं गलत काम कर रहा हूँ? एक जीपीयू के लिए एक टुकड़ा शेडर रास्ता में एक सौ पुनरावृत्तियों है? क्योंकि यह संकलित होने के ठीक बाद ठीक लगता है।

+0

वेबजीएल आम तौर पर आपके ओपनजीएल लाइब्रेरी में कंपाइलर को शेडर बंद कर देता है, तो यह क्या करता है और यह कितना समय लगता है आपके वीडियो कार्ड और ड्राइवर पर निर्भर करता है ... –

उत्तर

4

यह जीएलएसएल की दुर्भाग्यपूर्ण वास्तविकताओं में से एक है। यह बहुत अच्छा होगा अगर हम ऑफ़लाइन संकलन कर सकते हैं और बाइटकोड में भेज सकते हैं, या यदि हमारे पास संकलन समय पर झंडे निर्दिष्ट करने की क्षमता थी, लेकिन यह बिल्कुल नहीं है कि spec कैसे काम करता है। आप पूरी तरह से ड्राइवर निर्माता की दया पर हैं। यदि एनवीआईडीआईए/एटीआई सोचता है कि लूप अनोलिंग आपके लिए अच्छा है, तो आपका लूप अनियंत्रित हो जाएगा।

मुझे सवाल है कि यह क्या है कि आप ऐसा कर रहे हैं जिसके लिए बहुत लूपिंग की आवश्यकता है। सुपर जटिल लूपिंग या शाखाओं की गणना करने के लिए शेडर्स वास्तव में सही जगह नहीं हैं। आप निश्चित रूप से इसके लिए प्रदर्शन हिट लेंगे। यदि आप रीयलटाइम प्रदर्शन के बारे में चिंतित नहीं हैं, तो शायद आपके प्रोग्राम की शुरुआत में एक बड़ी संकलन हिट इतनी खराब नहीं है। यदि आप अपने ऐप की प्रतिपादन गति के बारे में चिंतित हैं तो आपको अपने शेडर्स जटिलता का फिर से मूल्यांकन करने की आवश्यकता है।

2

आप शेड को अधिकतम 100 पुनरावृत्तियों के साथ लूप को संकलित करने के लिए एक मिनट से अधिक समय लेते हुए उल्लेख करते हैं, और इससे मुझे लगता है कि आपकी समस्या ANGLE से संबंधित हो सकती है।

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

यदि आप विंडोज चला रहे हैं और आपके पास अच्छी गुणवत्ता वाले ओपनजीएल ड्राइवर हैं, जैसे एनवीडिया या एएमडी से उचित रूप से नए, तो आप यह देखने के लिए एंग्ल को अक्षम करने का प्रयास कर सकते हैं कि यह आपकी समस्या को हल करता है या नहीं। Google क्रोम पर यह --use-gl=desktop को कमांड लाइन पैरामीटर (आइकन के 'लक्ष्य' फ़ील्ड में) के रूप में जोड़ने और ब्राउज़र को पुनरारंभ करने के लिए अपने क्रोम आइकन को संपादित करके किया जाता है। फ़ायरफ़ॉक्स के लिए, आप about:config पर जा सकते हैं और खोज बॉक्स में webgl टाइप कर सकते हैं और webgl.prefer-native-gl देखें और इसे सही पर सेट करें।

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

0

दुख की बात है AMD शायद इसका समर्थन नहीं करता है, लेकिन मुझे लगता है कि एनवीडिया के पास एक अच्छा प्रगति अनोल निर्देश है। जिन लोगों को विपरीत समस्या है, उनके लिए आप इसे जीएलएसएल में "#pragma optionNV (सभी अनलॉक करें)" के रूप में आमंत्रित करेंगे, लेकिन मुझे लगता है कि निम्नलिखित अनोलिंग को रोक देंगे। मैं DenisR's 2008 post on the NVidia forums उद्धरण:

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

उदाहरण के लिए, इस कोड नमूने में:

पाश 5 बार unrolled किया जाएगा। यह सुनिश्चित करने के लिए प्रोग्रामर पर निर्भर है कि अनोलिंग प्रोग्राम की शुद्धता को प्रभावित नहीं करेगा (जो उपर्युक्त उदाहरण में हो सकता है, यदि एन 5 से छोटा है)।

#pragma unroll 1 

संकलक को कभी भी लूप को अनलॉक करने से रोक देगा।

यदि #pragma अनोल के बाद कोई संख्या निर्दिष्ट नहीं है, तो उसकी यात्रा गणना स्थिर होने पर लूप पूरी तरह से अनलॉक हो जाता है, अन्यथा यह बिल्कुल अनियंत्रित नहीं होता है।

तो मैं कल्पना कर सकते हैं कि

#pragma optionNV (unroll 1) 

GLSL में काम कर सकते हैं (और WebGL?)। (उदाहरण के लिए, StackOverflow question selective-nvidia-pragma-optionnvunroll-all का अर्थ है कि यह कम से कम कुछ प्लेटफ़ॉर्म के तहत जीएलएसएल में काम कर सकता है।)

ऐसा लगता है कि हाल के वर्षों में, एएमडी एक अनियंत्रित प्रगति का समर्थन कर सकता है (शायद जीएलएसएल में नहीं) लेकिन मैं परिचित नहीं हूँ और यह प्रयास नहीं किया है: unroll loops in an AMD OpenCL kernel

(क्रोम/फ़ायरफ़ॉक्स, या यहाँ तक कि अन्य स्थितियों में WebGL के माध्यम से GLSL का उपयोग कर रहे हैं, तो यह है कि GLSL संकलन ANGLE के माध्यम से पहुंचाया जा सकता है को ध्यान में रखना है, जो करने के लिए प्रस्तुत करना हो सकता है विंडोज़ पर एक एचएलएसएल बैकएंड, शायद। मुझे इसकी बहुत सीमित समझ है और जानकारी फैलाना नहीं चाहता है, इसलिए निश्चित रूप से इसका उद्धरण न दें; मुझे लगा कि इस समस्या पर मैंने जो जानकारी एकत्र की थी, उसे साझा करना आवश्यक था। दूर, और खुशी से इसे संपादित करेंगे उत्तर (या लोगों को इस उत्तर को संपादित करने के लिए स्वतंत्र महसूस होना चाहिए) क्योंकि अधिक पुष्टि की गई जानकारी उपलब्ध हो जाती है।)

संबंधित मुद्दे