सभी आधुनिक जीपीयू में स्केलर आर्किटेक्चर होता है, लेकिन छायांकन भाषाएं विभिन्न प्रकार के वेक्टर और मैट्रिक्स प्रकार प्रदान करती हैं। मैं जानना चाहता हूं, जीएलएसएल स्रोत कोड के स्केलेराइजेशन या वेक्टरनाइज़ेशन प्रदर्शन को कैसे प्रभावित करते हैं।जीएलएसएल: स्केलर बनाम वेक्टर प्रदर्शन
float p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y;
p0x = 0.0f; p0y = 0.0f;
p1x = 0.0f; p1y = 0.61f;
p2x = 0.9f; p2y = 0.4f;
p3x = 1.0f; p3y = 1.0f;
और उनके वेक्टर समकक्ष:
vec2 p0 = vec2(p0x, p0y);
vec2 p1 = vec2(p1x, p1y);
vec2 p2 = vec2(p2x, p2y);
vec2 p3 = vec2(p3x, p3y);
इन बातों के बाद, जो निम्नलिखित कोड का गणितीय बराबर टुकड़ों में से तेजी से चलेंगे उदाहरण के लिए, कुछ "अदिश" अंक को परिभाषित करते हैं?
अदिश कोड:
position.x = -p0x*pow(t-1.0,3.0)+p3x*(t*t*t)+p1x*t*pow(t-1.0,2.0)*3.0-p2x*(t*t)*(t-1.0)*3.0;
position.y = -p0y*pow(t-1.0,3.0)+p3y*(t*t*t)+p1y*t*pow(t-1.0,2.0)*3.0-p2y*(t*t)*(t-1.0)*3.0;
या यह वेक्टर बराबर है:
position.xy = -p0*pow(t-1.0,3.0)+p3*(t*t*t)+p1*t*pow(t-1.0,2.0)*3.0-p2*(t*t)*(t-1.0)*3.0;
?
या वे आधुनिक जीपीयू पर समान रूप से तेजी से दौड़ेंगे?
उपरोक्त कोड केवल एक उदाहरण है। ऐसे "वेक्टरिजेबल" कोड के वास्तविक जीवन उदाहरण वैश्विक in
एस, वर्दी और वर्टेक्स विशेषताओं से आने वाले अधिक इनपुट चर के साथ बहुत भारी गणना कर सकते हैं।
क्या इससे कोई फर्क पड़ता है? वेक्टर रूप अनदेखा रूपों की तुलना में अधिक पठनीय हैं। जो वास्तव में समझ में आता है और संकलक को अपना काम करने दें। –
जैसा कि @ निकोलबोलस ने उल्लेख किया है, glsl optimiser संकलन से पहले बहुत अनुकूलन करता है। तो मुझे लगता है कि दोनों कोड एक ही रूप में अनुकूलित किए जाएंगे। या, एक बेंचमार्क कर आपको अधिक जानकारी दे सकता है। – codetiger
@ निकोलबोलस: हाँ, इससे कोई फर्क नहीं पड़ता, खासकर क्योंकि आप नहीं जानते कि उपयोगकर्ता के पास कौन से ड्राइवर होंगे। निश्चित रूप से, 80% समय मुझे परवाह नहीं है, लेकिन 20% के लिए जब मुझे प्रदर्शन की आवश्यकता थी तो मैंने खुद से एक ही सवाल पूछा (और एक निश्चित जवाब नहीं मिला)। – ybungalobill