Standard Portable Intermediate Representation

ngôn ngữ máy tính trung gian xách tay tiêu chuẩn cho tính toán song song và đồ họa 3D của Khronos Group

Standard Portable Intermediate Representation (SPIR-V) là ngôn ngữ máy tính trung gian xách tay tiêu chuẩn cho tính toán song song, tính toán thông dụng trên bộ xử lý đồ họađồ họa 3D của Khronos Group. Nó được sử dụng trong nhiều môi trường thực thi, bao gồm API đồ họa Vulkan và API tính toán OpenCL API, để đại diện những shader (chương trình GPU cho đồ họa 3D song song) và những kernel (chương trình GPU cho tính toán song song).[1][2]

SPIR-V
Phát triển bởiKhronos Group
Phát hành lần đầu2015
Phiên bản ổn định
SPIR-V 1.6 / 16 tháng 12 năm 2021; 2 năm trước (2021-12-16)
Hệ điều hànhĐa nền tảng
Nền tảngĐa nền tảng
Thể loạiIntermediate language
Websitewww.khronos.org/registry/SPIR-V

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 sửa

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 GLSLHLSL.[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 sửa

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 APIOpenGL 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]
Ngày 7 tháng 5 năm 2019 1.4[1]
Ngày 13 tháng 9 năm 2019 1.5[1]
Ngày 16 tháng 12 năm 2021 1.6[1]

Tính năng sửa

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 sửa

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) sửa

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]

Trình gỡ lỗi shaders bao gồm RenderDoc, SwiftShader và Amber.[15]

Xác minh sửa

Đặ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 sửa

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 sửa

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]

Tham khảo sửa

  1. ^ a b c d “Khronos SPIR-V Registry - The Khronos Group Inc”. www.khronos.org. Truy cập ngày 5 tháng 8 năm 2019.
  2. ^ a b Terzo, Olivier; Djemame, Karim; Scionti, Alberto; Pezuela, Clara (10 tháng 9 năm 2019). Heterogeneous Computing Architectures: Challenges and Vision. CRC Press. ISBN 9780429680038. Truy cập ngày 24 tháng 6 năm 2022.
  3. ^ “Shader modules”. Vulkan Tutorial.
  4. ^ “HLSL as a First Class Vulkan Shading Language”. The Khronos Group (bằng tiếng Anh). 15 tháng 1 năm 2020.
  5. ^ KhronosGroup/SPIRV-Cross, The Khronos Group, 6 tháng 9 năm 2019, truy cập ngày 8 tháng 9 năm 2019
  6. ^ Parkerson, Stuart (4 tháng 3 năm 2015). “Khronos Group Introduces New Vulkan Hardware Driver API and SPIR-V Intermediate Language Shared by Vulkan and OpenCL 2.1”. App Developer Magazine. Truy cập ngày 5 tháng 4 năm 2015.
  7. ^ “Khronos Releases OpenCL 2.1 and SPIR-V 1.0 Specifications for Heterogeneous Parallel Programming”. www.Khronos.org. 16 tháng 11 năm 2015. Truy cập ngày 16 tháng 11 năm 2015.
  8. ^ Trevett, Neil (18 tháng 4 năm 2016). “OpenCL A State of the Union (IWOCL 2016)” (PDF). Khronos Group.
  9. ^ Trevett, Neil (16 tháng 5 năm 2017). “OpenCL State of the Nation (IWOCL 2017)” (PDF). IWOCL.
  10. ^ “SPIR - The Industry Open Standard Intermediate Language for Parallel Compute and Graphics”. The Khronos Group (bằng tiếng Anh). 20 tháng 1 năm 2014. Truy cập ngày 5 tháng 8 năm 2019.
  11. ^ Kessenich, John. “An Introduction to SPIR-V” (PDF). Khronos. Truy cập ngày 25 tháng 7 năm 2015.
  12. ^ a b “SPIRV-Guide”. github.com. Truy cập ngày 24 tháng 6 năm 2022.
  13. ^ “SPIR-V Specification: Structured Control Flow”. khronos.org. Truy cập ngày 24 tháng 6 năm 2022.
  14. ^ “Specialization Constants”. veldrid.dev. Truy cập ngày 24 tháng 6 năm 2022.
  15. ^ “Google Open-Sources 'Amber' Multi-API Shader Test Framework”. phoronix.com. Truy cập ngày 24 tháng 6 năm 2022.
  16. ^ “Shader Fundamentals”. informit.com. Truy cập ngày 24 tháng 6 năm 2022.
  17. ^ “SPIR-V Extension for Visual Studio”. saschawillems.de. Truy cập ngày 24 tháng 6 năm 2022.
  18. ^ “SPIR-V Specification: Language Capabilities”. khronos.org. Truy cập ngày 24 tháng 6 năm 2022.

Liên kết ngoài sửa