क्या गणवेश का संरेखण और घोषणा क्रम मायने रखता है?


10

किताब के प्रैक्टिस रेंडरिंग एंड कम्प्यूटेशन में डायरेक्ट 3 डी 11 (पेज 325, 326) के खंड 6.4 कॉन्स्टेंट बफ़र्स में इसका उल्लेख है:

डिफ़ॉल्ट रूप से, एचएलएसएल कंपाइलर स्थिरांक को संरेखित करने का प्रयास करेगा, ताकि वे कई फ्लोट 4 रजिस्टरों को न पाएं। [...] HLSL निरंतर बफर के लिए पैकिंग को भी मैन्युअल रूप से packoffset कीवर्ड के माध्यम से निर्दिष्ट किया जा सकता है।

मुझे लगता है कि एक समान नियम OpenGL के समतुल्य, यूनिफ़ॉर्म बफ़र ऑब्जेक्ट्स पर लागू होगा, क्योंकि वे एक ही हार्डवेयर फीचर में मैप करते हैं।

हालांकि वेनिला वर्दी के बारे में क्या? वर्दी घोषित करते समय कौन से नियम लागू होते हैं?

uniform vec2 xy; // Can we expect the compiler to pack xy
uniform vec2 zw; // into a same four component register?

uniform vec2 rg;
uniform float foo; // Will this prevent from packing rg and ba?
uniform vec2 ba;   // If so, will foo eat up a full four components register?

यदि कंपाइलर ऐसी अनुकूलन कर सकता है, तो वे कितने अच्छे हैं? क्या हम संकलक को स्पष्ट रूप से बता सकते हैं कि पैक करना है या नहीं और हमें कब करना चाहिए?

जवाबों:


4

मैं एक उत्तर की तलाश में था, इसलिए मैंने GCN के लिए संकलित होने पर निर्मित विधानसभा को देखने के लिए AMD के शेडर एनालाइज़र को डाउनलोड किया। नीचे विधानसभा में वेक्टर रजिस्टर v # हैं और स्केलर रजिस्टर # हैं।

ऐसा प्रतीत होता है कि वर्दी यहां तक ​​कि वेक्टर वर्दी को अलग-अलग स्केलर के रूप में शैडर में पारित किया जाता है, इसलिए एक vec3 3 स्केलर रजिस्टरों का उपयोग करेगा। बिट मैं भ्रमित पाया v0 से v4 था, मुझे यकीन नहीं है अगर v0 एक पूर्ण 4 फ्लोट रजिस्टर या रजिस्टर में एक एकल फ्लोट है, जिसमें एक पूर्ण वेक्टर रजिस्टर v0 से v3 तक फैला हुआ है। एक तरह से या किसी अन्य रूप में यह दो संस्करणों के बीच परिवर्तित नहीं हुआ, इसलिए मैं मान सकता हूं कि परिभाषा के आदेश ने विधानसभा को प्रभावित नहीं किया।

http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/07/AMD_GCN3_Instruction_Set_Architecture.pdf

#version 450

uniform vec2 xy; 
uniform vec2 zw;

out vec4 v;

void main(){ 
    v.xy = xy; 
    v.zw = zw; 
}

shader 
  asic(VI)
  type(VS)

  v_cndmask_b32  v0, s0, v0, vcc               
  v_mov_b32     v0, 0                          
  v_mov_b32     v1, 1.0                        
  exp           pos0, v0, v0, v0, v1 done      
  s_andn2_b32   s0, s5, 0x3fff0000             
  s_mov_b32     s1, s0                         
  s_mov_b32     s2, s6                         
  s_mov_b32     s3, s7                         
  s_mov_b32     s0, s4                         
  s_buffer_load_dwordx2  s[4:5], s[0:3], 0x00  
  s_buffer_load_dwordx2  s[0:1], s[0:3], 0x10  
  s_waitcnt     expcnt(0) & lgkmcnt(0)         
  v_mov_b32     v0, s4                         
  v_mov_b32     v1, s5                         
  v_mov_b32     v2, s0                         
  v_mov_b32     v3, s1                         
  exp           param0, v0, v1, v2, v3         
end

#version 450

uniform vec2 xy;
uniform float z;
uniform vec2 zw;

out vec4 v;

void main(){ 
    v.xy = xy; 
    v.zw = zw;
    v.w += z;
}

shader 
  asic(VI)
  type(VS)

  v_cndmask_b32  v0, s0, v0, vcc              
  v_mov_b32     v0, 0                         
  v_mov_b32     v1, 1.0                       
  s_andn2_b32   s0, s5, 0x3fff0000            
  exp           pos0, v0, v0, v0, v1 done     
  s_mov_b32     s1, s0                        
  s_mov_b32     s2, s6                        
  s_mov_b32     s3, s7                        
  s_mov_b32     s0, s4                        
  s_buffer_load_dword  s4, s[0:3], 0x10       
  s_buffer_load_dwordx2  s[6:7], s[0:3], 0x00 
  s_buffer_load_dwordx2  s[0:1], s[0:3], 0x20 
  s_waitcnt     expcnt(0) & lgkmcnt(0)        
  v_mov_b32     v0, s4                        
  v_add_f32     v0, s1, v0                    
  v_mov_b32     v1, s6                        
  v_mov_b32     v2, s7                        
  v_mov_b32     v3, s0                        
  exp           param0, v1, v2, v3, v0        
end

2
परिभाषा क्रम ने लेआउट को प्रभावित किया। यहां प्रासंगिक हिस्सा s_buffer_load_dwordनिर्देश है - जो इनपुट वर्दी पढ़ रहे हैं, और हेक्स में अंतिम संख्या से पढ़ने के लिए ऑफसेट है। यह पहले मामले xyमें ऑफसेट 0 पर और zwऑफसेट 16 पर दिखाता है। दूसरे मामले में आपके पास xyऑफसेट 0 पर, zऑफसेट 16 zwपर और ऑफसेट 32 पर है। ऐसा प्रतीत होता है कि सभी वर्दी व्यक्तिगत रूप से 16-बाइट-संरेखित हैं, और पैक नहीं किए गए हैं एक साथ या पुन: व्यवस्थित।
नाथन रीड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.