เงื่อนไขคงที่มีราคาแพงกว่าการเปลี่ยนเครื่องแต่ง


14

โดยทั่วไปแล้วการแตกแขนงในร่มเงาไม่ใช่ความคิดที่ดี แต่ตอนนี้ฉันมี shader ที่มีเงื่อนไขที่คงที่เกี่ยวกับการเรียกการดึงทั้งหมด ดังนั้นสาขาที่ดำเนินการจะเป็นแบบเดียวกันเสมอสำหรับการโทรแบบดึงครั้งเดียว

การแตกแขนงแบบนี้ยังมีค่าใช้จ่ายสูงกว่าการมีหลายเฉดสีที่ไม่มีกิ่งเหล่านี้และสลับไปมาระหว่างกันหรือไม่?



ตามคำตอบที่อธิบายไว้ในคำถามของฉันเศษเล็กเศษน้อยจะถูกจัดกลุ่มเป็น "warps" หรือ "wavefronts" และหากแฟรกเมนต์ทั้งหมดในกลุ่มใช้สาขาเดียวกันสาขาเดียวเท่านั้นที่จะดำเนินการ
Martin Ender

แต่สิ่งที่เกี่ยวกับเฉดสีแตกต่างจากส่วน?
nikitablack

2
ผมเชื่อว่าจุดได้รับการประกอบเป็นประลองยุทธ์หรือหน้าคลื่นเพียงเดียวกัน
Martin Ender

1
ฉันสงสัยว่านี่ไม่ใช่สิ่งที่ซ้ำกัน แต่จำเป็นต้องแก้ไขเพื่อให้ชัดเจนว่ามีการถามอะไรก่อนที่จะได้รับการพิจารณา ตัวอย่างโค้ดหรือคำอธิบายของตัวเลือกสองตัวที่นำมาเปรียบเทียบจะช่วยได้มาก
trichoplax

คำตอบ:


13

บนฮาร์ดแวร์ที่ทันสมัยหากการร้องขอทั้งหมดในกลุ่มเป็นไปตามเส้นทางเดียวกันเส้นทางที่ไม่ได้ใช้จะไม่ได้รับการประเมิน

ในรหัสหลอก:

if(cond){
   res = ...
}else{
   res = ...
}

กลายเป็น

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

โดยที่anyInvocationARBจะเป็นจริงหากการเรียกใช้ shader ใด ๆ จะมีค่าเป็นcond(จากส่วนขยาย opengl ARB_shader_group_vote )

ถ้า cond เป็นผลมาจากเครื่องแบบคนเดียวจากนั้นคนขับอาจปรับให้เหมาะสมและประเมินสภาพก่อนที่จะเริ่มการเรนเดอร์และแทนที่ if ด้วย goto เป็นสาขาที่ถูกต้อง OpenGL มีคุณสมบัติที่เรียกว่ารูทีนย่อยที่เหมือนกันซึ่งทำให้ชัดเจน


4
นี่เป็นเรื่องจริง แต่ไม่ใช่สิ่งเดียวที่คุณต้องพิจารณาสำหรับการแสดง GPU ยังคงกำหนดเวลาทรัพยากรไว้ต่อส่วนที่คงที่ดังนั้นสิ่งนี้อาจยังคงเป็นทรัพยากรราวกับว่าคุณกำลังทำงานทั้งสองสาขาซึ่งอาจส่งผลเสียต่อการเข้าพัก
John Calsbeek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.