Standard Portable Intermediate Representation

**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 và đồ 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).

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. 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. 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ị.

## Các phiên bản
SPIR-V 1.0 được giới thiệu vào tháng 3 năm 2015  và phát hành vào ngày 16 tháng 11 năm 2015.

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.

## Tính năng
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.

### 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. 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.

### 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. 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.

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

### Xác minh
Đặ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. 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.

### 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ợ.

## Tham khảo

## Liên kết ngoài
* Khronos SPIR webpage
* SPIR-V specification