2016-09-14 9 views
8

सभी आधुनिक जीपीयू में स्केलर आर्किटेक्चर होता है, लेकिन छायांकन भाषाएं विभिन्न प्रकार के वेक्टर और मैट्रिक्स प्रकार प्रदान करती हैं। मैं जानना चाहता हूं, जीएलएसएल स्रोत कोड के स्केलेराइजेशन या वेक्टरनाइज़ेशन प्रदर्शन को कैसे प्रभावित करते हैं।जीएलएसएल: स्केलर बनाम वेक्टर प्रदर्शन

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 एस, वर्दी और वर्टेक्स विशेषताओं से आने वाले अधिक इनपुट चर के साथ बहुत भारी गणना कर सकते हैं।

+5

क्या इससे कोई फर्क पड़ता है? वेक्टर रूप अनदेखा रूपों की तुलना में अधिक पठनीय हैं। जो वास्तव में समझ में आता है और संकलक को अपना काम करने दें। –

+0

जैसा कि @ निकोलबोलस ने उल्लेख किया है, glsl optimiser संकलन से पहले बहुत अनुकूलन करता है। तो मुझे लगता है कि दोनों कोड एक ही रूप में अनुकूलित किए जाएंगे। या, एक बेंचमार्क कर आपको अधिक जानकारी दे सकता है। – codetiger

+1

@ निकोलबोलस: हाँ, इससे कोई फर्क नहीं पड़ता, खासकर क्योंकि आप नहीं जानते कि उपयोगकर्ता के पास कौन से ड्राइवर होंगे। निश्चित रूप से, 80% समय मुझे परवाह नहीं है, लेकिन 20% के लिए जब मुझे प्रदर्शन की आवश्यकता थी तो मैंने खुद से एक ही सवाल पूछा (और एक निश्चित जवाब नहीं मिला)। – ybungalobill

उत्तर

2

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

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

महत्वपूर्ण बात यह है कि आपके उपयोग के मामले में, आपकी सबसे अच्छी शर्त कोड को अधिक रखरखाव करने पर ध्यान केंद्रित करना है; जो आपको अधिक समय बचाएगा, और आपके प्रोग्राम को किसी भी "समयपूर्व अनुकूलन" की तुलना में बेहतर बनाएगा (जो, स्पष्ट हो, मूल रूप से आप जो कर रहे हैं)।

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