การจัดตำแหน่งและการประกาศของเครื่องแบบมีความสำคัญหรือไม่?


10

ในส่วน6.4 บัฟเฟอร์คงที่ของหนังสือการแสดงผลและการคำนวณเชิงปฏิบัติด้วย Direct3D 11 (หน้า 325, 326) มีการกล่าวถึง:

โดยค่าเริ่มต้นคอมไพเลอร์ HLSL จะพยายามจัดตำแหน่งค่าคงที่ซึ่งจะไม่ขยายการลงทะเบียน float4 หลายรายการ [... ] การบรรจุสำหรับบัฟเฟอร์คงที่ HLSL ยังสามารถระบุด้วยตนเองผ่านคีย์เวิร์ด packoffset

ฉันคิดว่ากฎที่คล้ายกันจะใช้กับ OpenGL ที่เทียบเท่ากันคือ Uniform Buffer Objects เนื่องจากจะจับคู่กับคุณสมบัติฮาร์ดแวร์เดียวกัน

แล้วเครื่องแบบวนิลาล่ะ กฎที่บังคับใช้เมื่อประกาศเครื่องแบบคืออะไร

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

ฉันไปหาคำตอบดังนั้นฉันจึงดาวน์โหลดตัววิเคราะห์ shader ของ AMD เพื่อดูชุดประกอบที่สร้างขึ้นเมื่อรวบรวมสำหรับ GCN ในการชุมนุมด้านล่างเวกเตอร์ลงทะเบียนเป็น v # และเซนต์คิตส์และเนวิสเป็น s #

ดูเหมือนว่าเครื่องแบบแม้ชุดเครื่องแบบเวกเตอร์จะถูกส่งผ่านไปยัง shader เป็นสเกลาร์แยกดังนั้น vec3 จะใช้สเกลาร์ 3 รีจิสเตอร์ บิตที่ฉันพบว่าสับสนคือ v0 ถึง v4 ฉันไม่แน่ใจว่า v0 นั้นเป็น 4 register แบบเต็มหรือแบบ float เดียวใน register โดยมี vector register แบบเต็มซึ่งครอบคลุม 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 ไบต์และไม่บรรจุ ด้วยกันหรือจัดลำดับใหม่
นาธานรีด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.