SPIR-V, một ngôn ngữ mới, được giới thiệu vào năm 2015 bởi Khronos Group, và kể từ đó đã thay thế SPIR ban đầu (được giới thiệu vào năm 2012).
Mục đích
Các mục đích của SPIR-V bao gồm đại diện các phần tử chương trình cần thiết của shaders (chương trình GPU cho đồ họa 3D song song) và kernels (chương trình GPU cho tính toán song song), để tách ngôn ngữ cấp cao khỏi giao diện với trình điều khiển thiết bị đồ họa, là hình thức phân phối tiêu chuẩn, là một đặc điểm kỹ thuật hoàn toàn độc lập, và để hỗ trợ nhiều API. Nó cũng được sử dụng như một mục tiêu trung gian cho những bộ biên dịch phân tầng.
Ví dụ: SPIR-V cho phép Vulkan API sử dụng bất kỳ ngôn ngữ shader, bao gồm GLSL và HLSL.[3][4] SPIR-V có thể được biên dịch thành một số ngôn ngữ shading (GLSL, GLSL ES, MSL, HLSL) bằng cách sử dụng SPIRV-Cross, để các ngôn ngữ này có thể được chuyển đổi lẫn nhau.[5] Nó cũng có các đường dẫn đến/từ WebGPU, OpenCL, SYCL, C++.
Trong các thiết bị đích, việc nhập SPIR-V loại bỏ nhu cầu xây dựng trình biên dịch nguồn ngôn ngữ cao thành trình điều khiển thiết bị, điều này làm giảm độ phức tạp của trình điều khiển thiết bị.[2]
Các phiên bản
SPIR-V 1.0 được giới thiệu vào tháng 3 năm 2015[6] và phát hành vào ngày 16 tháng 11 năm 2015.[7]
Hỗ trợ nhập SPIR-V được tích hợp trong các đặc điểm kỹ thuật của OpenCL 2.1, Vulkan API và OpenGL phiên bản 4.6.
SPIR-V Releases
Date
Version
Notes
Ngày 18 tháng 4 năm 2016
1.1
Released at IWOCL 2016 along with Provisional OpenCL 2.2. SPIR-V 1.1 added support for OpenCL C++, initializer/finalizer function execution modes, named barriers, subgroup execution, program scope pipes and pipe storage.[8]
Ngày 16 tháng 5 năm 2017
1.2
Released at IWOCL 2017 along with OpenCL 2.2. SPIR-V 1.2 added support for runtime specialization of key tuning parameters in OpenCL 2.2.[9]
Ngày 7 tháng 3 năm 2018
1.3
Released along with Vulkan 1.1. SPIR-V 1.3 Added support for subgroup operations and enables enhanced compiler optimizations.[10]
SPIR-V là ngôn ngữ trung gian cấp cao, được trao đổi dưới dạng nhị phân. Các hàm (functions) được biểu thị bằng đồ thị luồng điều khiển (control-flow graph) của các basic block, sử dụng biểu mẫu static single assignment (SSA). Cấu trúc dữ liệu giữ lại biểu diễn phân cấp mức độ cao. Nó không bị mất mát, không như mã byte trước đây hoặc các biểu diễn trung gian giống như máy ảo được sử dụng cho các shaders đồ họa. Điều này cho phép gần hơn với hiệu suất tối ưu trên các thiết bị mục tiêu.[11]
Khả năng mở rộng
SPIR-V có thể được mở rộng bằng cách viết các phần mở rộng (extensions) để thêm ngữ nghĩa hoặc bằng đặt trước một dãy số cho nhà cung cấp. Các nhà cung cấp có thể thêm ngữ nghĩa mong muốn vào SPIR-V một cách độc lập.[12] Thêm tập lệnh mở rộng bổ sung (extended instruction sets) có thể được cung cấp trong các thông số kỹ thuật riêng biệt. Nhiều bộ tập lệnh có thể được nhập mà không gặp vấn đề gì, vì lệnh mở rộng được sử dụng bằng cách chỉ định ID của tập lệnh và ID của lệnh trong tập lệnh.[12]
Shaders/Kernels (các chương trình GPU song song)
Trình tạo bóng đồ họa sử dụng luồng điều khiển có cấu trúc (structured control flow) trong SPIR-V để nêu cách tổ chức luồng điều khiển. Điều này giúp xác định sự phân kỳ và hội tụ lại của luồng điều khiển trên các môi trường thực thi song song.[13] Specialization (chuyên môn hóa) làm giảm số lượng biến thể của shaders cần được phân phối.[14]
Đặc điểm kỹ thuật SPIR-V nêu rõ các quy tắc phải tuân theo để có mô-đun SPIR-V hợp lệ. Điều này cho xác minh ngoại tuyến. Trình điều khiển thiết bị không có nghĩa vụ phải xử lý các mô-đun SPIR-V không hợp lệ. Trong thử nghiệm, kiểm tra conformance test (sự phù hợp) rằng trình điều khiển hoạt động chính xác khi sử dụng SPIR-V hợp lệ, trong khi các validators (trình xác minh) xác minh rằng giao diện người dùng tạo ra SPIR-V đúng cách.
Liên kết
SPIR-V có thể thể hiện các lệnh gọi đến các hàm trong một đơn vị biên dịch (compilation unit) khác. Phiên bản tiêu chuẩn của SPIR-V sử dụng tính năng này cho các kernel tính toán OpenCL, nhưng không sử dụng cho các shader, mà các API đồ họa muốn được liên kết đầy đủ thành một mô-đun SPIR-V.[16] Có các phần mở rộng có sẵn để cho phép các công cụ tạm thời sử dụng các shader được liên kết một phần và cả các kernel.[17]
Khả năng
Mô-đun SPIR-V được sử dụng bởi API khách để hỗ trợ các tính năng của mô-đun đó, được phân loại thông qua các khả năng và được khai báo sớm trong mô-đun. Trình xác minh có thể xác minh rằng mô-đun chỉ sử dụng các khả năng được khai báo và API khách có thể từ chối các mô-đun khai báo các khả năng không được hỗ trợ.[18]