ประสิทธิภาพการวนซ้ำในเครื่อง Shader


11

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

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

แล้ววิธีที่ดีที่สุดในการทำซ้ำแถวลำดับนี้คืออะไร

ควรใช้ลูปที่ไม่ได้ควบคุมหรือลูปไดนามิกสำหรับบางอย่างระหว่างการทำซ้ำ 4 ถึง 128 หรือไม่ if (i == myCurrentMaximumIterationNumber)ผมเคยเห็นยังว่ามันเป็นไปได้ที่จะคายมันจำนวนสูงสุดที่กำหนดไว้ล่วงหน้าซ้ำแล้วหยุดมันด้วยสภาพเช่น


2
คุณพยายามทำอะไรกับอาเรย์และลูป? ฉันกำลังถามเพราะสิ่งนี้ฟังดูเหมือนปัญหา XYกับฉัน เนื่องจากวิธีที่ดีที่สุดในการใช้เงื่อนไขและลูปใน GPU คือการละเว้นจากการใช้มันอาจจะมีวิธีที่ดีกว่าแทนที่จะใช้อาร์เรย์และลูปในกรณีของคุณ
Nero

ฉันกำลังใช้เอฟเฟกต์การกระเจิงของพื้นผิวหน้าจอที่ใช้งานได้ในปัจจุบัน แต่ฉันมีข้อสงสัยเกี่ยวกับวิธีที่ฉันใช้เคอร์เนลตามการแสดง ฉันเลือกที่จะทำขนาดอาเรย์สูงสุดแล้วเติมเพียงบางส่วนและใช้ลูปแบบไดนามิกที่มีจำนวนการวนซ้ำแบบไดนามิกซึ่งเกี่ยวข้องกับเนื้อหาอาเรย์ที่ใช้ในปัจจุบัน ฉันคิดว่ามีสิ่งที่ต้องทำหรือรู้ว่าเมื่อเขียนโปรแกรมเฉดสีตามการแสดงเช่น และในความเห็นของฉันลูปเป็นหัวข้อประสิทธิภาพทั่วไปซึ่งอาจเป็นไปตามกฎบางอย่างและอาจ "แนวปฏิบัติที่ดี" แต่ฉันไม่พบคำตอบที่ดีเกี่ยวกับเรื่องนี้
MaT

คำตอบ:


6

คอมไพเลอร์ของ Shader มีความก้าวร้าวอย่างมากเกี่ยวกับการคลี่คลายเนื่องจาก HW ในช่วงต้นมักไม่มีการควบคุมการไหลและค่าใช้จ่ายใน HW ล่าสุดอาจแตกต่างกันไป หากคุณมีเกณฑ์มาตรฐานคุณกำลังทดสอบและฮาร์ดแวร์ที่เกี่ยวข้องอยู่ให้ลองทำสิ่งต่าง ๆ เพื่อดูว่าเกิดอะไรขึ้น การวนซ้ำแบบไดนามิกของคุณนั้นคล้อยตามการแทรกแซงของนักพัฒนามากกว่าการวนซ้ำแบบคงที่ แต่การปล่อยให้วงไปยังคอมไพเลอร์ยังคงเป็นคำแนะนำที่ดีเว้นแต่คุณจะมีเกณฑ์มาตรฐาน ด้วยมาตรฐานการสำรวจจึงคุ้มค่า (และสนุก)

BTW การสูญเสียที่ยิ่งใหญ่ที่สุดกับลูปแบบไดนามิกบน GPU คือ "เธรด" แต่ละรายการใน wavefront / warp จะเสร็จสิ้นในเวลาที่ต่างกัน เธรดที่หยุดในภายหลังบังคับให้เธรดทั้งหมดที่เสร็จสิ้นก่อนเพื่อเรียกใช้งาน NOP

ลูปซ้อนควรพิจารณาอย่างรอบคอบผ่าน: ฉันใช้ตัวถอดรหัสเอนโทรปีของบล็อกที่เข้ารหัสการทำงานของศูนย์ (สำหรับ JPEG เช่นการบีบอัด) การใช้งานตามธรรมชาติคือการถอดรหัสการรันในลูปภายในที่แน่นหนาซึ่งหมายความว่ามีเธรดเดียวเท่านั้นที่กำลังดำเนินการ โดยการทำให้วนรอบแบนและทดสอบอย่างชัดเจนในแต่ละเธรดหากกำลังถอดรหัสการรันหรือไม่ฉันยังคงเธรดทั้งหมดที่ใช้งานผ่านลูปความยาวคงที่ (บล็อกที่ถอดรหัสมีขนาดเท่ากันทั้งหมด) หากเธรดเหมือนเธรดของ CPU การเปลี่ยนแปลงจะน่ากลัว แต่บน GPU ที่ฉันใช้งานฉันเพิ่มประสิทธิภาพการทำงาน 6 เท่า (ซึ่งยังแย่มาก - ไม่มีบล็อกเพียงพอที่จะทำให้ GPU ไม่ว่าง - แต่มันเป็นข้อพิสูจน์ของแนวคิด)

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