Shader संकलक अनियंत्रित होने के बारे में बेहद आक्रामक हैं क्योंकि शुरुआती HW में अक्सर प्रवाह नियंत्रण नहीं होता था और हाल ही के HW पर लागत भिन्न हो सकती है। यदि आपके पास एक बेंचमार्क है जिसे आप सक्रिय रूप से परीक्षण कर रहे हैं और प्रासंगिक हार्डवेयर की एक सीमा है, तो चीजों को देखें कि क्या होता है। आपका डायनेमिक लूप एक स्थिर लूप की तुलना में डेवलपर के हस्तक्षेप के लिए अधिक उत्तरदायी है - लेकिन इसे संकलक पर छोड़ना तब भी अच्छी सलाह है जब तक कि आपके पास कोई बेंचमार्क उपलब्ध न हो। एक बेंचमार्क के साथ, अन्वेषण सार्थक (और मजेदार) है।
BTW, एक GPU पर एक गतिशील लूप के साथ सबसे बड़ा नुकसान यह है कि एक तरंग / ताना में अलग-अलग "धागे" अलग-अलग समय पर समाप्त हो जाएंगे। बाद में बंद होने वाले धागे एनओपी को निष्पादित करने के लिए जल्दी खत्म होने वाले सभी को मजबूर करते हैं।
नेस्टेड लूप्स के माध्यम से सावधानी से सोचा जाना चाहिए: मैंने एक ब्लॉक आधारित एन्ट्रापी डिकोडर लागू किया है जो जीरो (संपीड़न जैसे जेपीईजी के लिए) के रन को एन्कोड करता है। प्राकृतिक कार्यान्वयन को एक तंग आंतरिक लूप में रन को डिकोड करना था - जिसका मतलब अक्सर केवल एक धागा प्रगति कर रहा था; लूप को समतल करके और प्रत्येक थ्रेड में स्पष्ट रूप से परीक्षण करके अगर यह वर्तमान में एक रन को डिकोड कर रहा है या नहीं, मैंने सभी थ्रेड्स को निश्चित लंबाई के लूप के माध्यम से सक्रिय रखा (डिकोड किए गए ब्लॉक सभी समान आकार थे)। यदि थ्रेड्स सीपीयू थ्रेड्स की तरह होते हैं, तो परिवर्तन भयानक होता, लेकिन मैं जिस GPU पर चल रहा था, मुझे प्रदर्शन में 6 गुना वृद्धि हुई (जो अभी भी भयानक थी - GPU को व्यस्त रखने के लिए पर्याप्त ब्लॉक नहीं थे - लेकिन यह अवधारणा का प्रमाण था)।