วิเคราะห์ประสิทธิภาพของ Shader

AGI Frame Profiler ช่วยให้คุณตรวจสอบ Shader ได้โดย เลือก Draw Call จาก Render Pass รายการใดรายการหนึ่งของเรา แล้วไปที่ส่วนVertex Shader หรือส่วนFragment Shader ของแผงไปป์ไลน์

ในส่วนนี้ คุณจะเห็นสถิติที่เป็นประโยชน์ซึ่งมาจากการวิเคราะห์แบบคงที่ของโค้ดเชเดอร์ รวมถึงแอสเซมบลี Standard Portable Intermediate Representation (SPIR-V) ที่ GLSL ของเราคอมไพล์ลงไป นอกจากนี้ยังมีแท็บ สำหรับดูการแสดง GLSL ต้นฉบับ (พร้อมชื่อที่คอมไพเลอร์สร้างขึ้นสำหรับตัวแปร ฟังก์ชัน และอื่นๆ) ที่คอมไพล์ย้อนกลับด้วย SPIR-V Cross เพื่อให้บริบทเพิ่มเติมสำหรับ SPIR-V

การวิเคราะห์แบบคงที่

คำบรรยาย
รูปที่ 1 คำบรรยาย??

ใช้ตัวนับการวิเคราะห์แบบคงที่เพื่อดูการดำเนินการระดับต่ำใน Shader

  • คำสั่ง ALU: จำนวนนี้แสดงจำนวนการดำเนินการ ALU (การบวก การคูณ การหาร และอื่นๆ) ที่ดำเนินการภายใน Shader และเป็นตัวแทนที่ดีสำหรับความซับซ้อนของ Shader พยายามลด ค่านี้

    การปรับโครงสร้างการคำนวณทั่วไปหรือการลดความซับซ้อนของการคำนวณที่ทำใน Shader จะช่วยลดจำนวนคำสั่งที่จำเป็นได้

  • คำสั่งเกี่ยวกับเท็กซ์เจอร์: จำนวนนี้แสดงจำนวนครั้งที่การสุ่มตัวอย่างเท็กซ์เจอร์ เกิดขึ้นใน Shader

    • การสุ่มตัวอย่างเท็กซ์เจอร์อาจมีค่าใช้จ่ายสูง ทั้งนี้ขึ้นอยู่กับประเภทของเท็กซ์เจอร์ ที่สุ่มตัวอย่าง ดังนั้นการอ้างอิงโค้ดเชเดอร์กับเท็กซ์เจอร์ที่ผูกไว้ ซึ่งอยู่ในส่วนชุดตัวอธิบายจะให้ข้อมูลเพิ่มเติมเกี่ยวกับ ประเภทของเท็กซ์เจอร์ที่ใช้
    • หลีกเลี่ยงการเข้าถึงแบบสุ่มเมื่อสุ่มตัวอย่างเท็กซ์เจอร์ เนื่องจากลักษณะการทำงานนี้ไม่เหมาะกับการแคชเท็กซ์เจอร์
  • คำสั่งสาขา: จำนวนนี้แสดงจำนวนการดำเนินการสาขา ใน Shader การลดการแยกสาขาเหมาะอย่างยิ่งสำหรับโปรเซสเซอร์แบบขนาน เช่น GPU และยังช่วยให้คอมไพเลอร์ค้นหาการเพิ่มประสิทธิภาพเพิ่มเติมได้ด้วย

    • ใช้ฟังก์ชัน เช่น min, max และ clamp เพื่อหลีกเลี่ยงการ แยกสาขาตามค่าตัวเลข
    • ทดสอบต้นทุนการคำนวณเมื่อมีการแยกสาขา เนื่องจากเส้นทางทั้ง 2 เส้นทางของ กิ่งก้านจะดำเนินการในสถาปัตยกรรมจำนวนมาก จึงมีหลายสถานการณ์ ที่การคำนวณเสมอจะเร็วกว่าการข้าม การคำนวณด้วยกิ่งก้าน
  • รีจิสเตอร์ชั่วคราว: รีจิสเตอร์เหล่านี้เป็นรีจิสเตอร์ที่รวดเร็วและอยู่บนแกนประมวลผล ซึ่งใช้เพื่อ จัดเก็บผลลัพธ์ของการดำเนินการขั้นกลางที่จำเป็นสำหรับการคำนวณใน GPU จำนวนรีจิสเตอร์ที่ใช้ได้สำหรับการคำนวณมีจำกัด ก่อนที่ GPU จะต้องใช้หน่วยความจำนอกคอร์อื่นๆ เพื่อจัดเก็บ ค่ากลาง ซึ่งจะลดประสิทธิภาพโดยรวม (ขีดจำกัดนี้จะแตกต่างกันไป ตามรุ่นของ GPU)

    จำนวนรีจิสเตอร์ชั่วคราวที่ใช้จริงอาจสูงกว่าที่คาดไว้หากคอมไพเลอร์ Shader ดำเนินการต่างๆ เช่น การคลายลูป ดังนั้นจึงควรตรวจสอบค่านี้กับ SPIR-V หรือ GLSL ที่คอมไพล์แล้วเพื่อดูว่าโค้ดทำอะไรอยู่

การวิเคราะห์โค้ด Shader

ตรวจสอบโค้ด Shader ที่คอมไพล์ย้อนกลับเพื่อดูว่า สามารถปรับปรุงได้หรือไม่

คำบรรยาย
รูปที่ 2 คำบรรยาย??
  • ความแม่นยำ: ความแม่นยำของตัวแปร Shader อาจส่งผลต่อประสิทธิภาพ GPU ของแอปพลิเคชัน
    • ลองใช้mediumpตัวแก้ไขความแม่นยำกับตัวแปรทุกที่ที่ทำได้ เนื่องจากตัวแปรความแม่นยำปานกลาง (mediump) 16 บิตมักจะเร็วกว่าและประหยัดพลังงานมากกว่าตัวแปรความแม่นยำเต็ม (highp) 32 บิต
    • หากไม่เห็นตัวระบุความแม่นยำใน Shader ในการประกาศตัวแปร หรือที่ด้านบนของ Shader ที่มี precision precision-qualifier​ type​ ระบบจะตั้งค่าเริ่มต้นเป็นความแม่นยำเต็ม (highp) อย่าลืมดูการประกาศตัวแปรด้วย
    • นอกจากนี้ เรายังแนะนำให้ใช้ mediump สำหรับเอาต์พุต Vertex Shader ด้วยเหตุผลเดียวกันกับที่อธิบายไว้ข้างต้น และยังช่วยลดแบนด์วิดท์ของหน่วยความจำและอาจลดการใช้รีจิสเตอร์ชั่วคราวที่จำเป็นต่อการทำอินเทอร์โพเลชันได้ด้วย
  • Uniform Buffers: พยายามทำให้ขนาดของ Uniform Buffers เล็กที่สุดเท่าที่จะเป็นไปได้ (โดยยังคงรักษากฎการจัดแนวไว้) ซึ่งช่วยให้การคำนวณ เข้ากันได้กับการแคชมากขึ้น และอาจช่วยให้ระบบสามารถ เลื่อนระดับข้อมูลที่สม่ำเสมอไปยังรีจิสเตอร์ในคอร์ที่เร็วกว่าได้
  • นำเอาต์พุต Vertex Shader ที่ไม่ได้ใช้ออก: หากพบว่า Fragment Shader ไม่ได้ใช้เอาต์พุต Vertex Shader ให้นำเอาต์พุตเหล่านั้นออกจาก Shader เพื่อเพิ่มแบนด์วิดท์ของหน่วยความจำและรีจิสเตอร์ชั่วคราว

  • ย้ายการคำนวณจาก Fragment Shader ไปยัง Vertex Shader: หากโค้ด Fragment Shader ทำการคำนวณที่ไม่ขึ้นอยู่กับสถานะที่เฉพาะเจาะจงกับ Fragment ที่กำลังแรเงา (หรือสามารถประมาณค่าได้อย่างเหมาะสม) การย้ายไปยัง Vertex Shader จะเป็นตัวเลือกที่เหมาะสม สาเหตุคือในแอปส่วนใหญ่ Vertex Shader จะทำงานน้อยกว่า Fragment Shader มาก