ইউনিফর্মের অ্যালিগমেন্ট এবং ঘোষণার আদেশের বিষয়টি কি বিবেচনা করে?


10

ডাইরেক্ট 3 ডি 11 (পৃষ্ঠা 325, 326) সহ প্রাকটিক্যাল রেন্ডারিং এবং কমপিটেশন বইয়ের 6.4 বিভাগের ধ্রুব বাফারগুলিতে এটি উল্লেখ করা হয়েছে:

ডিফল্টরূপে, এইচএলএসএল সংকলক ধ্রুবকগুলিকে এমনভাবে সারিবদ্ধ করার চেষ্টা করবে যাতে তারা একাধিক ফ্লোট 4 নিবন্ধগুলি ছড়িয়ে না দেয়। [...] এইচএলএসএল ধ্রুবক বাফারের জন্য প্যাকিংও প্যাক অফসেট কীওয়ার্ডের মাধ্যমে ম্যানুয়ালি নির্দিষ্ট করা যেতে পারে।

আমি ধরে নিয়েছি ওপেনজিএল সমতুল্য, ইউনিফর্ম বাফার অবজেক্টগুলিতে অনুরূপ একটি বিধি প্রযোজ্য হবে, যেহেতু তারা একই হার্ডওয়্যার বৈশিষ্ট্যে মানচিত্র করে।

ভ্যানিলা ইউনিফর্ম সম্পর্কে কি তবে? ইউনিফর্ম ঘোষণা করার সময় প্রয়োগ করা বিধিগুলি কী কী?

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

আমি একটি উত্তর খুঁজতে গিয়েছিলাম, তাই আমি জিসিএন এর জন্য সংকলিত হওয়ার সময় উত্পাদিত সমাবেশটি দেখতে এএমডির শেডার বিশ্লেষকটি ডাউনলোড করেছিলাম। নীচে সমাবেশে ভেক্টর নিবন্ধগুলি v # এবং স্কেলার রেজিস্টারগুলি s # হয়।

এটি প্রদর্শিত হবে যে ইউনিফর্ম এমনকি ভেক্টর ইউনিফর্মগুলি শেডারে পৃথক স্কেলার হিসাবে প্রেরণ করা হয়, সুতরাং একটি ভিস 3 3 স্কেলার রেজিস্টার ব্যবহার করবে। আমি যে বিটটি বিভ্রান্তিকর অবস্থায় পেয়েছি তা v0 থেকে v4 ছিল, আমি নিশ্চিত নই যে v0 একটি পূর্ণ 4 ভাসা রেজিস্টার বা একটি রেজিস্টারে একটি ভাসা ভিজিটর ভিজিটর V0 থেকে v3 বিস্তৃত রয়েছে with একরকম বা অন্যভাবে এটি দুটি সংস্করণের মধ্যে পরিবর্তিত হয় নি বলে আমি ধরে নিতে পারি সংজ্ঞা অর্ডারটি সমাবেশকে প্রভাবিত করে না।

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নির্দেশাবলী - সেগুলি ইনপুট ইউনিফর্মগুলি পড়ছে এবং হেক্সের শেষ সংখ্যাটি পড়ার অফসেট। এটা প্রথম ক্ষেত্রে দেখায় xy0 অফসেট করা হয় এবং zwএ 16. অফসেট দ্বিতীয় ক্ষেত্রে আপনি সালে xyঅফসেট 0 এ, z16 অফসেট, এবং zwঅফসেট 32 এ দেখে মনে হচ্ছে সব ইউনিফর্ম স্বতন্ত্রভাবে 16-বাইট-প্রান্তিককৃত, এবং বস্তাবন্দী না একসাথে বা পুনরায় সাজানো।
নাথান রিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.