อ่าน 5 นาที
การแสดงผลระดับกลางแบบพกพามาตรฐาน
Standard Portable Intermediate Representation ( SPIR ) เป็นภาษาตัวกลางสำหรับการประมวลผลแบบขนานและกราฟิกโดยKhronos Groupใช้ในสภาพแวดล้อมการทำงานหลายแบบ รวมถึงVulkan graphics...
การแสดงผลระดับกลางแบบพกพามาตรฐาน
| สปิร-วี | |
|---|---|
| นักพัฒนา | กลุ่มโครโนส |
| ปล่อย | 2015 |
| เวอร์ชันเสถียร | SPIR-V 1.6 / 16 ธันวาคม 2564 |
| ระบบปฏิบัติการ | ข้ามแพลตฟอร์ม |
| แพลตฟอร์ม | ข้ามแพลตฟอร์ม |
| พิมพ์ | ภาษาระดับกลาง |
| เว็บไซต์ | www |
Standard Portable Intermediate Representation ( SPIR ) เป็นภาษาตัวกลางสำหรับการประมวลผลแบบขนานและกราฟิกโดยKhronos Groupใช้ในสภาพแวดล้อมการทำงานหลายแบบ รวมถึงVulkan graphics APIและOpenCL compute API เพื่อแสดงshaderหรือkernelนอกจากนี้ยังใช้เป็นภาษาแลกเปลี่ยนสำหรับการคอมไพล์ข้ามแพลตฟอร์ม[ 1 ] [ 2 ]
SPIR-Vเป็นเวอร์ชันใหม่ของ SPIR ซึ่งเปิดตัวในปี 2015 โดยKhronos Groupและได้เข้ามาแทนที่ SPIR รุ่นเดิมซึ่งเปิดตัวในปี 2012
เมื่อวันที่ 19 กันยายน 2024 ไมโครซอฟต์ได้ประกาศแผนการนำ SPIR-V มาใช้เป็น รูปแบบการแลกเปลี่ยน Direct3Dแทน DXIL โดยเริ่มรองรับตั้งแต่ Shader Model 7 เป็นต้นไป[ 3 ]
วัตถุประสงค์
จุดประสงค์ของ SPIR-V คือ การแสดงข้อมูลพื้นฐานที่จำเป็นสำหรับการประมวลผลและกราฟิกโดยตรง การแยกภาษาโปรแกรมระดับสูงออกจากส่วนติดต่อผู้ใช้สำหรับไดรเวอร์ประมวลผลและกราฟิก การเป็นรูปแบบการแจกจ่าย หรือแจกจ่ายไบนารีที่คอมไพล์เสร็จสมบูรณ์ การเป็นข้อกำหนดที่ครบถ้วนในตัวเอง และการสนับสนุน API หลายตัว นอกจากนี้ยังใช้เป็นเป้าหมายระดับกลางสำหรับเครื่องมือการคอมไพล์ข้ามแพลตฟอร์มอีกด้วย
ตัวอย่างเช่น SPIR-V อนุญาตให้Vulkan APIใช้ภาษาการแรเงา ใดก็ได้ รวมถึงGLSL และ HLSL [ 4 ] [ 5 ] SPIR -V สามารถถอดรหัสเป็นภาษาการแรเงาหลายภาษา ( GLSL , GLSL ES , MSL , HLSL ) โดยใช้ SPIRV-Cross เพื่อให้สามารถแปลงภาษาเหล่านี้ระหว่างกันได้[ 6 ]นอกจากนี้ยังมีเส้นทางไปยังและ/หรือจากWebGPU , OpenCL , SYCL , C++และRustด้วย
ในแพลตฟอร์มเป้าหมาย การนำ SPIR-V เข้ามาจะช่วยลดความจำเป็นในการสร้างคอมไพเลอร์ซอร์สโค้ดภาษาระดับสูงลงในไดรเวอร์อุปกรณ์ ซึ่งจะช่วยลดความซับซ้อนของไดรเวอร์[ 2 ]
เวอร์ชัน
SPIR เปิดตัวครั้งแรกในปี 2011 และ SPIR-V เปิดตัวในปี 2015
| สปิร 1.2 | สปิร 2.0 | SPIR-V 1.X | |
|---|---|---|---|
| การโต้ตอบของ LLVM | LLVM IRเวอร์ชัน 3.2 | LLVM IRเวอร์ชัน 3.4 |
|
| โครงสร้างการคำนวณ | เมตาเดตา/ค่าภายใน | เมตาเดตา/ค่าภายใน | พื้นเมือง |
| โครงสร้างกราฟิก | เลขที่ | เลขที่ | พื้นเมือง |
| ภาษาที่รองรับและคุณสมบัติที่รองรับ | OpenCL C 1.2 |
|
|
| การนำเข้า OpenCL | ส่วนขยาย OpenCL 1.2 | ส่วนขยาย OpenCL 2.0 | OpenCL 2.1/2.2 Core |
| การนำเข้า API กราฟิก | ไม่มีข้อมูล | ไม่มีข้อมูล |
|
เวอร์ชันที่ใช้ LLVM
SPIR ก่อนการเปิดตัว SPIR-V ในปี 2015 นั้นใช้พื้นฐานจากLLVM Intermediate Representationมีการประกาศข้อกำหนดชั่วคราวสำหรับ SPIR 1.0 ในปี 2012 [ 7 ]เมื่อวันที่ 22 กรกฎาคม 2013 มีการประกาศข้อกำหนดชั่วคราว SPIR 1.2 ในงานSIGGRAPH 2013 [ 8 ] ข้อกำหนด SPIR 1.2 ฉบับสุดท้ายได้รับการเผยแพร่ในงาน HiPEAC 2014 เมื่อวันที่ 21 มกราคม 2014 [ 9 ]เมื่อวันที่ 11 สิงหาคม 2014 มีการเผยแพร่ข้อกำหนดชั่วคราวสำหรับ SPIR 2.0 ในงานSIGGRAPH 2014 [ 10 ] SPIR -V ไม่ได้ใช้ LLVM [ 2 ]
สปิร-วี
SPIR-V 1.0 เป็นเวอร์ชันใหม่ของ SPIR ที่ประกาศในเดือนมีนาคม พ.ศ. 2558 [ 11 ]และวางจำหน่ายในวันที่ 16 พฤศจิกายน พ.ศ. 2558 [ 12 ]ปัจจุบันตระกูล SPIR ประกอบด้วยมาตรฐาน cross-API ที่แท้จริงซึ่งกำหนดโดย Khronos อย่างสมบูรณ์พร้อมการสนับสนุนแบบเนทีฟสำหรับคุณสมบัติของ shader และ kernel
โปรแกรมแยกต่างหากจาก Khronos Group ช่วยให้สามารถแปลงระหว่าง LLVM IR ได้[ 13 ]
การรองรับการนำเข้าข้อมูล SPIR-V นั้นถูกรวมอยู่ในข้อกำหนดหลักของ OpenCL 2.1, Vulkan APIและOpenGLเวอร์ชัน 4.6 แล้ว
| วันที่ | เวอร์ชั่น | หมายเหตุ |
|---|---|---|
| 18 เมษายน 2559 | 1.1 | เปิดตัวที่IWOCL 2016พร้อมกับ Provisional OpenCL 2.2 SPIR-V 1.1 เพิ่มการสนับสนุนสำหรับ OpenCL C++, โหมดการทำงานของฟังก์ชัน initializer/finalizer, ตัวกั้นที่มีชื่อ, การทำงานของกลุ่มย่อย, ท่อขอบเขตโปรแกรม และการจัดเก็บท่อ[ 14 ] |
| 16 พฤษภาคม 2560 | 1.2 | เปิดตัวที่IWOCL 2017พร้อมกับ OpenCL 2.2 SPIR-V 1.2 เพิ่มการสนับสนุนสำหรับการปรับแต่งพารามิเตอร์หลักใน OpenCL 2.2 ในขณะรันไทม์[ 15 ] |
| 7 มีนาคม 2561 | 1.3 | เผยแพร่พร้อมกับVulkan 1.1 SPIR-V 1.3 เพิ่มการสนับสนุนสำหรับการดำเนินการกลุ่มย่อยและเปิดใช้งานการเพิ่มประสิทธิภาพคอมไพเลอร์ที่ได้รับการปรับปรุง[ 16 ] |
| 7 พฤษภาคม 2562 | 1.4 [ 1 ] | |
| 13 กันยายน 2020 | 1.5 [ 1 ] | |
| 16 ธันวาคม 2021 | 1.6 [ 1 ] |
คุณสมบัติ
SPIR-V เป็นภาษาระดับกลางระดับสูงที่แลกเปลี่ยนในรูปแบบไบนารี ฟังก์ชันต่างๆ จะถูกแทนด้วยกราฟควบคุมการไหลของบล็อกพื้นฐาน โดยใช้ รูปแบบ การกำหนดค่าเดี่ยวแบบคงที่ (SSA) โครงสร้างข้อมูลยังคงรักษาการแสดงลำดับชั้นระดับสูงไว้ ไม่สูญเสียข้อมูลเหมือนไบต์โค้ดหรือการแสดงระดับกลางแบบเครื่องเสมือนก่อนหน้านี้ที่ใช้สำหรับเชเดอร์กราฟิก ซึ่งช่วยให้ได้ประสิทธิภาพที่ใกล้เคียงกับประสิทธิภาพสูงสุดบนอุปกรณ์เป้าหมาย[ 17 ]
ความสามารถในการขยาย
SPIR-V สามารถขยายได้โดยการเขียนส่วนขยายเพื่อเพิ่มความหมาย หรือสงวนช่วงของค่าโทเค็นไว้สำหรับการใช้งานของฝ่ายต่างๆ ผู้ขายสามารถเพิ่มความหมายที่ต้องการลงใน SPIR-V ได้อย่างอิสระ[ 18 ]ชุดคำสั่งเพิ่มเติมที่ขยายแล้วสามารถจัดเตรียมได้ในข้อกำหนดแยกต่างหาก สามารถนำเข้าชุดคำสั่งหลายชุดได้โดยไม่มีปัญหา เนื่องจากคำสั่งที่ขยายแล้วจะใช้โดยการระบุ ID ของชุดและของคำสั่งภายในชุด[ 18 ]
เชเดอร์
โปรแกรมดีบักเกอร์ประกอบด้วยRenderDoc , SwiftShader และ Amber [ 19 ]
เชเดอร์กราฟิกใช้การควบคุมการไหลแบบมีโครงสร้างใน SPIR-V เพื่อระบุวิธีการซ้อนการควบคุมการไหล ซึ่งช่วยในการกำหนดการแยกตัวและการบรรจบกันของการควบคุมการไหลในสภาพแวดล้อมการประมวลผลแบบขนาน[ 20 ]การกำหนดเฉพาะทางช่วยลดจำนวนตัวแปรของเชเดอร์ที่ต้องแจกจ่าย[ 21 ]
การตรวจสอบความถูกต้อง
ข้อกำหนด SPIR-V ระบุถึงกฎที่ต้องปฏิบัติตามเพื่อให้โมดูล SPIR-V ถูกต้อง ซึ่งช่วยให้สามารถตรวจสอบความถูกต้องแบบออฟไลน์ได้ ไดรเวอร์ไม่จำเป็นต้องจัดการกับโมดูล SPIR-V ที่ไม่ถูกต้อง ในการทดสอบ การทดสอบความสอดคล้องจะตรวจสอบว่าไดรเวอร์ทำงานได้อย่างถูกต้องเมื่อใช้ SPIR-V ที่ถูกต้อง ในขณะที่ตัวตรวจสอบจะตรวจสอบว่าส่วนหน้าสร้าง SPIR-V ได้อย่างถูกต้อง[ 22 ]
การเชื่อมโยง
SPIR-V สามารถแสดงการเรียกใช้ฟังก์ชันในหน่วยการคอมไพล์ที่แตกต่างกันได้ เวอร์ชันมาตรฐานของ SPIR-V ใช้คุณสมบัตินี้สำหรับเคอร์เนลการคำนวณ OpenCL แต่ไม่ใช่สำหรับขั้นตอนเชเดอร์ ซึ่ง API กราฟิกต้องการให้เชื่อมโยงอย่างสมบูรณ์ในโมดูล SPIR-V เดียว[ 23 ]มีส่วนขยายที่พร้อมใช้งานเพื่อให้เครื่องมือสามารถใช้เชเดอร์และเคอร์เนลที่เชื่อมโยงบางส่วนได้ชั่วคราว[ 24 ]
ความสามารถ
โมดูล SPIR-V ถูกใช้โดย API ไคลเอ็นต์เพื่อรองรับคุณสมบัติของโมดูลนั้น ซึ่งจะถูกจำแนกประเภทผ่านความสามารถ และประกาศไว้ตั้งแต่ต้นโมดูล ตัวตรวจสอบความถูกต้องสามารถยืนยันได้ว่าโมดูลใช้เฉพาะความสามารถที่ประกาศไว้เท่านั้น และ API ไคลเอ็นต์สามารถปฏิเสธโมดูลที่ประกาศความสามารถที่ไม่ได้รับการสนับสนุนได้[ 25 ]
SPIR-V สำหรับการคอมไพล์ข้ามแพลตฟอร์ม GLSL
SPIR-V ถูกใช้เพื่อช่วยจัดการกับภาษาระดับซอร์สโค้ดหลายเวอร์ชัน ตัวอย่างเช่น ภาษา OpenGL Shading Language (GLSL) หลายเวอร์ชันจำเป็นต้องมีการแจกจ่าย shaders หลายเวอร์ชัน เนื่องจากมีการใช้งานที่ผูกติดอยู่กับ GLSL เวอร์ชันเก่าที่เฉพาะเจาะจง เช่นWebGL 1.0และการใช้งาน OpenGL ของ Apple หนึ่งในกรณีการใช้งานที่โดดเด่นของ SPIR-V คือความสามารถในการใช้เป็นรูปแบบการแลกเปลี่ยนระหว่าง GLSL เวอร์ชันต่างๆ โดยใช้เครื่องมือที่ดูแลโดยKhronos Group สำหรับการ คอมไพล์ GLSL เป็น SPIR-V glslangValidator[ 26 ]การเพิ่มประสิทธิภาพ SPIR-V [ 22 ]และการคอมไพล์ข้ามแพลตฟอร์มเป็น SPIR-V สำหรับเป้าหมาย GLSL ที่แตกต่างกัน[ 27 ]spirv-optspirv-cross
อย่างไรก็ตาม ในฐานะรูปแบบ SPIR-V มีข้อจำกัดบางประการสำหรับการคอมไพล์ข้ามแพลตฟอร์ม รวมถึงข้อกำหนดที่ว่าโมดูล SPIR-V ทุกโมดูลต้องมีสัญลักษณ์จุดเริ่มต้นอย่างน้อยหนึ่งตัว ซึ่งทำให้รูปแบบนี้ไม่สามารถใช้สำหรับการคอมไพล์แยกกันได้ง่าย โดยที่เชเดอร์ที่ซับซ้อนสามารถประกอบขึ้นได้ด้วยชุดขั้นตอนการคอมไพล์บางส่วนตามด้วยขั้นตอนการเชื่อมโยง ซึ่งขัดแย้งกับเป้าหมายที่ระบุไว้ของเครื่องมือ SPIR-V บางอย่าง เช่นspirv-link[ 22 ] ซึ่งมีจุดมุ่งหมายเพื่อให้ฟังก์ชันการเชื่อมโยงแบบเต็มรูปแบบสำหรับโค้ดไบนารี SPIR-V
ดูเพิ่มเติม
- ภาษาการแรเงาระดับสูง (HLSL)
- ซีจี (ภาษาโปรแกรม)
- ภาษาแรเงา OpenGL (GLSL)
- โครงสร้างพื้นฐาน Shader ของ Tungsten Graphics
- เคอร์เนลการคำนวณ
- การประมวลผลเธรดแบบขนาน
- ภาษาแอสเซมบลี ARB
ลิงก์ภายนอก
- หน้าเว็บ Khronos SPIR
- ข้อมูลจำเพาะของ SPIR-V
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การแสดงผลระดับกลางแบบพกพามาตรฐาน
Standard Portable Intermediate Representation ( SPIR ) เป็นภาษาตัวกลางสำหรับการประมวลผลแบบขนานและกราฟิกโดยKhronos Groupใช้ในสภาพแวดล้อมการทำงานหลายแบบ รวมถึงVulkan graphics...
วัตถุประสงค์
จุดประสงค์ของ SPIR-V คือ การแสดงข้อมูลพื้นฐานที่จำเป็นสำหรับการประมวลผลและกราฟิกโดยตรง การแยกภาษาโปรแกรมระดับสูงออกจากส่วนติดต่อผู้ใช้สำหรับไดรเวอร์ประมวลผลและกราฟิก การเป็นรูปแบบการแจกจ่าย หรือแจกจ่ายไบนารีที่คอมไพล์เสร็จสมบูรณ์...
เวอร์ชัน
SPIR เปิดตัวครั้งแรกในปี 2011 และ SPIR-V เปิดตัวในปี 2015
เวอร์ชันที่ใช้ LLVM
SPIR ก่อนการเปิดตัว SPIR-V ในปี 2015 นั้นใช้พื้นฐานจาก LLVM Intermediate Representation มีการประกาศข้อกำหนดชั่วคราวสำหรับ SPIR 1.0 ในปี 2012 [ 7 ] เมื่อวันที่ 22 กรกฎาคม 2013 มีการประกาศข้อกำหนดชั่วคราว SPIR 1.2 ในงาน SIGGRAPH 2013 [ 8 ] ข้อกำหนด SPIR 1.