การอัพเดตบัฟเฟอร์ความลึกทำงานอย่างไรใน GPU


10

ตอนนี้ฉันกำลังพยายามใช้บัฟเฟอร์ความลึกบางประเภทในซอฟต์แวร์และฉันมีปัญหาใหญ่เมื่อฉันเขียนลงไป มีหนึ่ง mutex เกินความจริงแน่นอน ดังนั้นฉันจึงสร้างจำนวน mutexes เท่ากับจำนวนเธรด ฉันล็อค mutex ตามพิกเซลปัจจุบัน (pixel_index% mutexes_number) และใช้งานได้ดีกว่า แต่ก็ช้ามาก และฉันสงสัยว่ามันทำใน GPU จริงได้อย่างไร? มีอัลกอริทึมหรือฮาร์ดแวร์ที่จัดการกับมันได้หรือไม่?

คำตอบ:


9

ฮาร์ดแวร์ที่มีความเชี่ยวชาญสูงจัดการกับมัน กลยุทธ์ทั่วไปสำหรับ GPU ในการเรียงภาพแรสเตอร์และจัดเก็บข้อมูลเชิงลึกในรูปแบบที่บีบอัด (เช่นสมการ z เมื่อรูปหลายเหลี่ยมครอบคลุมแผ่นกระเบื้องทั้งหมด) วิธีนี้ช่วยให้สามารถทดสอบกระเบื้องทั้งหมดได้ในครั้งเดียว เทคนิค HW ที่ยอดเยี่ยมอื่น ๆ รวมถึงการทดสอบเชิงลึกก่อนที่จะใช้ Pixel Shader (สมมติว่าเงื่อนไขอนุญาต - Shader ไม่สามารถเขียนค่าความลึก) คุณอาจพิจารณาบางสิ่งที่คล้ายกันในซอฟต์แวร์เช่นการมีเธรดแต่ละชุด "เป็นเจ้าของ" ชุดย่อยของไพ่และเดินแต่ละแบบดั้งเดิมอย่างอิสระหรือเลียนแบบกลยุทธ์ multi-gpu เช่นเฟรมสำรองหรือบรรทัดแรสเตอร์สำรอง


11

ใน GPU จริงแทนที่จะมีหลายแกนพยายามอ่าน / เขียนพื้นที่เดียวกันของบัฟเฟอร์ความลึกและพยายามซิงโครไนซ์ระหว่างกันบัฟเฟอร์ความลึกจะแบ่งออกเป็นไทล์ (เช่น 16 × 16 หรือ 32 × 32) และแต่ละอัน ไทล์ถูกกำหนดให้กับแกนเดียว แกนนั้นรับผิดชอบการแรสเตอร์ทั้งหมดในไทล์นั้น: สามเหลี่ยมใด ๆ ที่แตะไทล์นั้นจะถูกแรสเตอร์ (ภายในไทล์นั้น) โดยแกนที่เป็นเจ้าของ จากนั้นจะไม่มีการรบกวนระหว่างคอร์และไม่จำเป็นต้องให้ซิงโครไนซ์เมื่อเข้าถึงส่วนเฟรมเวิร์กของพวกเขา

นี่หมายความว่ารูปสามเหลี่ยมที่สัมผัสหลายแผ่นจะต้องมีการแรสเตอร์ด้วยหลายแกน ดังนั้นจึงมีขั้นตอนการกระจายงานระหว่างการประมวลผลทางเรขาคณิต (การดำเนินการเกี่ยวกับจุดยอดและรูปสามเหลี่ยม) และการประมวลผลพิกเซล

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

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

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