นั่นเป็นเพราะ GPU บางรุ่นเท่านั้นที่สามารถรองรับการเรียกใช้ฟังก์ชั่นและแม้ว่าจะทำได้การเรียกใช้ฟังก์ชันอาจช้าหรือมีข้อ จำกัด เช่นความลึกของสแต็กน้อยมาก
รหัส Shader และรหัสคำนวณ GPU อาจดูเหมือนว่าจะมีการเรียกใช้ฟังก์ชั่นทั่วทุกสถานที่ แต่ภายใต้สถานการณ์ปกติพวกมันจะถูกคอมไพล์เลอร์ 100% รหัสเครื่องที่ดำเนินการโดย GPU บรรจุกิ่งและลูป แต่ไม่มีการเรียกใช้ฟังก์ชัน อย่างไรก็ตามการเรียกฟังก์ชันแบบเรียกซ้ำไม่สามารถ inline ได้ด้วยเหตุผลที่ชัดเจน (เว้นแต่อาร์กิวเมนต์บางตัวเป็นค่าคงที่เวลาคอมไพล์ในลักษณะที่คอมไพเลอร์สามารถพับและอินไลน์ต้นไม้ทั้งหมดของการเรียก)
ในการใช้งานการเรียกใช้ฟังก์ชันจริงคุณต้องมีสแต็ก ส่วนใหญ่แล้วรหัส shader ไม่ได้ใช้สแต็กเลย - GPU มีไฟล์ลงทะเบียนขนาดใหญ่และตัวเฉดสีสามารถเก็บข้อมูลทั้งหมดของพวกเขาในการลงทะเบียนตลอดเวลา เป็นการยากที่จะทำให้ stack ทำงานได้เพราะ (a) คุณต้องการพื้นที่สแต็คจำนวนมากเพื่อให้ warps ทั้งหมดที่สามารถบินได้ในแต่ละครั้งและ (b) ระบบหน่วยความจำ GPU ได้รับการปรับแต่งให้เหมาะสำหรับการรวมกันเป็นจำนวนมาก การทำธุรกรรมของหน่วยความจำเพื่อให้ได้ปริมาณงานสูง แต่สิ่งนี้มาจากความล่าช้าดังนั้นฉันเดาว่าการทำงานแบบกองซ้อนเช่นการบันทึก / เรียกคืนตัวแปรในเครื่องจะช้ามาก
ในอดีตการเรียกใช้ฟังก์ชั่นระดับฮาร์ดแวร์นั้นไม่ได้มีประโยชน์กับ GPU มากนัก ดังนั้นสถาปนิก GPU จึงไม่ได้เน้นไปที่การทำให้เร็ว อาจมีการแลกเปลี่ยนที่แตกต่างกันบางอย่างหากมีความต้องการการเรียกระดับฮาร์ดแวร์ที่มีประสิทธิภาพในอนาคต แต่ (เช่นเดียวกับทุกอย่างในด้านวิศวกรรม) มันจะต้องเสียค่าใช้จ่ายที่อื่น
เท่าที่เรย์ทรัคเป็นห่วงวิธีที่ผู้คนมักจะจัดการกับสิ่งนี้คือการสร้างคิวรังสีที่อยู่ในกระบวนการของการติดตาม แทนที่จะเพิ่มการเรียกซ้ำคุณเพิ่มเรย์ลงในคิวและในระดับสูงคุณจะมีลูปที่คอยประมวลผลจนกว่าคิวทั้งหมดจะว่างเปล่า แม้ว่าจะต้องมีการจัดระเบียบรหัสการเรนเดอร์ใหม่อย่างมีนัยสำคัญหากคุณเริ่มต้นจาก raytracer แบบคลาสสิก สำหรับข้อมูลเพิ่มเติมกระดาษดีในการอ่านเกี่ยวกับเรื่องนี้เป็นคลื่นเส้นทางติดตาม