जीएलएसएल में ब्रांचिंग के कारण क्या जीपीयू मॉडल और ओपनजीएल ड्राइवर संस्करण पर निर्भर करता है।
अधिकांश GPU को लगता है कि "दो मूल्यों में से एक का चयन करें" ऑपरेशन का एक रूप है जिसकी कोई शाखा नहीं है:
n = (a==b) ? x : y;
और कभी-कभी जैसी चीजें:
if(a==b) {
n = x;
m = y;
} else {
n = y;
m = x;
}
बिना ब्रांचिंग पेनल्टी वाले कुछ चुनिंदा-वैल्यू ऑपरेशन को कम किया जाएगा।
कुछ GPU / ड्राइवर्स में दो मूल्यों के बीच तुलना ऑपरेटर पर थोड़ा जुर्माना (शून्य) है, लेकिन शून्य के मुकाबले तुलनात्मक रूप से तेज़ संचालन।
जहां यह करने के लिए तेज़ हो सकता है:
gl_FragColor.xyz = ((tmp1 - tmp2) != vec3(0.0)) ? E : tmp1;
(tmp1 != tmp2)
सीधे तुलना करने के बजाय, लेकिन यह बहुत ही GPU और ड्राइवर पर निर्भर है, जब तक कि आप एक बहुत ही विशिष्ट GPU को लक्षित नहीं कर रहे हैं और कोई अन्य नहीं है जो मैं तुलना ऑपरेशन का उपयोग करने की सलाह देता हूं और ओपनग्ल ड्राइवर को नौकरी का अनुकूलन करने की सलाह देता हूं, क्योंकि किसी अन्य ड्राइवर के पास लंबे फॉर्म के साथ समस्या हो सकती है। और सरल, अधिक पठनीय तरीके के साथ तेज हो।
"शाखाएँ" हमेशा एक बुरी चीज नहीं होती हैं। उदाहरण के लिए OpenPandora में उपयोग किए जाने वाले SGX530 GPU पर, यह स्केल 2x shader (30ms):
lowp vec3 E = texture2D(s_texture0, v_texCoord[0]).xyz;
lowp vec3 D = texture2D(s_texture0, v_texCoord[1]).xyz;
lowp vec3 F = texture2D(s_texture0, v_texCoord[2]).xyz;
lowp vec3 H = texture2D(s_texture0, v_texCoord[3]).xyz;
lowp vec3 B = texture2D(s_texture0, v_texCoord[4]).xyz;
if ((D - F) * (H - B) == vec3(0.0)) {
gl_FragColor.xyz = E;
} else {
lowp vec2 p = fract(pos);
lowp vec3 tmp1 = p.x < 0.5 ? D : F;
lowp vec3 tmp2 = p.y < 0.5 ? H : B;
gl_FragColor.xyz = ((tmp1 - tmp2) != vec3(0.0)) ? E : tmp1;
}
इस समकक्ष shader (80ms) की तुलना में नाटकीय रूप से तेज़ी से समाप्त हुआ:
lowp vec3 E = texture2D(s_texture0, v_texCoord[0]).xyz;
lowp vec3 D = texture2D(s_texture0, v_texCoord[1]).xyz;
lowp vec3 F = texture2D(s_texture0, v_texCoord[2]).xyz;
lowp vec3 H = texture2D(s_texture0, v_texCoord[3]).xyz;
lowp vec3 B = texture2D(s_texture0, v_texCoord[4]).xyz;
lowp vec2 p = fract(pos);
lowp vec3 tmp1 = p.x < 0.5 ? D : F;
lowp vec3 tmp2 = p.y < 0.5 ? H : B;
lowp vec3 tmp3 = D == F || H == B ? E : tmp1;
gl_FragColor.xyz = tmp1 == tmp2 ? tmp3 : E;
आप पहले से कभी नहीं जानते हैं कि एक विशिष्ट GLSL संकलक या एक विशिष्ट GPU कैसे काम करेगा जब तक आप इसे बेंचमार्क नहीं करते।
बिंदु में जोड़ने के लिए (यहां तक कि मेरे पास वास्तविक समय संख्या और shader कोड नहीं है जो आपको इस भाग के लिए प्रस्तुत करने के लिए) मैं वर्तमान में अपने नियमित परीक्षण हार्डवेयर के रूप में उपयोग करता हूं:
- इंटेल एचडी ग्राफिक्स 3000
- इंटेल एचडी 405 ग्राफिक्स
- एनवीडिया जीटीएक्स 560 एम
- एनवीडिया जीटीएक्स 960
- AMD Radeon R7 260X
- एनवीडिया जीटीएक्स 1050
परीक्षण करने के लिए विभिन्न, सामान्य, GPU मॉडल की एक विस्तृत श्रृंखला के रूप में।
विंडोज, लिनक्स मालिकाना और लिनक्स ओपन सोर्स ओपनजीएल और ओपनसीएल ड्राइवरों के साथ प्रत्येक का परीक्षण।
और हर बार जब मैं GLSL शेडर (ऊपर SGX530 उदाहरण के रूप में) या एक विशेष GPU / चालक कॉम्बो के लिए OpenCL संचालन का प्रयास करता हूं, तो मैं दूसरे GPU / ड्राइवर्स में से एक से अधिक पर प्रदर्शन को समान रूप से नुकसान पहुंचाता हूं।
तो स्पष्ट रूप से उच्च-स्तरीय गणितीय जटिलता को कम करने के अलावा (जैसे: एकल पारस्परिक के लिए 5 समान विभाजनों को बदलें और इसके बजाय 5 गुणन) और बनावट लुकअप / बैंडविड्थ को कम करें, यह सबसे अधिक संभावना है कि आपके समय की बर्बादी होगी।
हर GPU दूसरों से बहुत अलग है।
यदि आप विशेष रूप से (ए) गेमिंग कंसोल (एस) पर एक विशिष्ट जीपीयू के साथ काम कर रहे हैं तो यह एक अलग कहानी होगी।
अन्य (छोटे गेम देवों के लिए लेकिन अभी भी उल्लेखनीय) के लिए कम महत्वपूर्ण पहलू यह है कि कंप्यूटर GPU ड्राइवर एक दिन चुपचाप आपके शेड्स ( यदि आपका गेम काफी लोकप्रिय हो जाता है ) को री-लिखित लोगों के साथ उस विशेष GPU के लिए अनुकूलित कर सकते हैं। ऐसा करना आपके लिए सब काम करता है।
वे लोकप्रिय खेलों के लिए ऐसा करेंगे जो अक्सर बेंचमार्क के रूप में उपयोग किए जाते हैं।
या यदि आप अपने खिलाड़ियों को शेड्स तक पहुंच देते हैं, तो वे आसानी से उन्हें खुद संपादित कर सकते हैं, उनमें से कुछ अपने स्वयं के लाभ के लिए कुछ अतिरिक्त एफपीएस निचोड़ सकते हैं।
उदाहरण के लिए, पंखे से बने शेडर और टेक्सचर पैक ओब्लाइव के लिए नाटकीय रूप से फ्रेम दर को बढ़ाने के लिए अन्यथा मुश्किल से बजाने वाले हार्डवेयर हैं।
और अंत में, एक बार जब आपका शेडर पर्याप्त रूप से जटिल हो जाता है, तो आपका गेम लगभग पूरा हो जाता है, और आप विभिन्न हार्डवेयर पर परीक्षण करना शुरू कर देते हैं, आप काफी व्यस्त होंगे बस अपने शेडर्स को विभिन्न प्रकार के GPU पर काम करने के लिए ठीक कर देंगे क्योंकि यह विभिन्न बगों के कारण होता है जो आप अभ्यस्त नहीं होंगे। उन्हें उस डिग्री के लिए अनुकूलित करने का समय है।