Открыть сервис

SPIR-V

SPIR-V (Standard Portable Intermediate Representation — Vulkan) — это бинарный промежуточный язык (промежуточное представление) для шейдеров и вычислительных ядер, разработанный консорциумом Khronos Group. Он используется в графических API Vulkan, OpenGL 4.6 и OpenCL 2.2 для компиляции шейдерных программ, написанных на языках высокого уровня (например, GLSL, HLSL, OpenCL C), в машинно-независимый код, который затем транслируется драйвером в исполняемый код для конкретного графического процессора (GPU). SPIR-V является преемником более ранних версий SPIR (1.0 и 2.0) и единственной версией, поддерживаемой в современных спецификациях Khronos.

История

Разработка SPIR началась в 2013 году как ответ на необходимость стандартизации промежуточного представления для шейдеров. До этого шейдеры компилировались из исходного кода (например, GLSL) непосредственно драйвером, что приводило к проблемам совместимости и производительности, так как каждый производитель GPU (NVIDIA, AMD, Intel) реализовывал компиляцию по-своему. SPIR 1.0, основанный на LLVM IR, был выпущен в 2014 году, но имел ограничения, связанные с привязкой к конкретному формату LLVM.

В 2016 году Khronos Group представила SPIR-V 1.0, который был полностью переработан и не зависел от LLVM. Он стал обязательным для Vulkan 1.0 и OpenCL 2.2. В последующие годы вышли версии 1.1 (2018), 1.2 (2019), 1.3 (2020), 1.4 (2021) и 1.5 (2022), добавившие поддержку новых возможностей, таких как улучшенная работа с 64-битными типами, расширения для трассировки лучей (Ray Tracing) и интеграция с Vulkan 1.3.

Архитектура и устройство

SPIR-V представляет собой бинарный формат, основанный на потоке инструкций (instruction stream). Каждая инструкция состоит из заголовка (5-байтовое слово, содержащее код операции и количество операндов) и переменного числа операндов. Формат не использует синтаксический анализ текста, что делает его компактным и быстрым для загрузки.

Основные компоненты

  • Модуль (Module): корневой элемент, содержащий все инструкции шейдера. Включает заголовок (версия, генератор, границы инструкций) и последовательность блоков.
  • Блоки (Blocks): логические единицы, такие как типы, константы, функции, глобальные переменные и код.
  • Инструкции: более 300 стандартных кодов операций, охватывающих арифметику, логику, управление потоком, доступ к памяти, вызовы функций и работу с текстурами.
  • Типы данных: поддерживаются скалярные (bool, int8/16/32/64, float16/32/64), векторные (до 4 компонентов), матричные, структуры, массивы, указатели, изображения, сэмплеры и специальные типы для трассировки лучей.

Отличия от других IR

В отличие от LLVM IR, SPIR-V не является оптимизирующим компилятором — он предназначен для передачи уже оптимизированного кода от фронтенда (например, компилятора GLSL) к бэкенду (драйверу GPU). Это позволяет избежать повторной оптимизации на стороне драйвера, ускоряя загрузку шейдеров. SPIR-V также строго типизирован и не поддерживает динамическую типизацию, что упрощает верификацию.

Применение

Vulkan

SPIR-V является обязательным форматом для шейдеров в Vulkan. Разработчик компилирует GLSL- или HLSL-код в SPIR-V с помощью офлайн-компиляторов (например, glslangValidator от Khronos или DXC от Microsoft), а затем загружает бинарный файл в приложение. Vulkan не поддерживает прямой компиляции из исходного кода, что повышает переносимость между разными GPU.

OpenGL 4.6

Начиная с версии 4.6, OpenGL поддерживает загрузку SPIR-V через расширение GL_ARB_gl_spirv. Это позволяет использовать SPIR-V вместо традиционной компиляции GLSL, хотя большинство приложений по-прежнему используют исходный код.

OpenCL 2.2

SPIR-V используется в OpenCL 2.2 для представления вычислительных ядер. Это позволяет компилировать код на OpenCL C, C++ for OpenCL или SYCL в SPIR-V, а затем загружать его на устройства разных производителей.

Другие области

SPIR-V применяется в:

  • WebGPU: хотя WebGPU использует свой собственный формат (WGSL), SPIR-V может быть преобразован в WGSL через инструменты, такие как spirv-cross.
  • Трассировка лучей: расширения SPIR-V для Vulkan Ray Tracing (VK_KHR_ray_tracing) добавляют инструкции для работы с ускоряющими структурами и вызовами шейдеров.
  • Машинное обучение: SPIR-V используется в некоторых фреймворках (например, TensorFlow Lite) для выполнения нейросетевых вычислений на GPU через Vulkan Compute.

Инструменты и экосистема

Компиляторы

  • glslangValidator: официальный компилятор GLSL в SPIR-V от Khronos.
  • DXC (DirectX Shader Compiler): компилятор HLSL от Microsoft, поддерживающий генерацию SPIR-V для Vulkan.
  • shaderc: обёртка над glslang, используемая в проектах Google (например, в движке Filament).
  • spirv-opt: оптимизатор SPIR-V, входящий в состав SPIRV-Tools от Khronos.

Декомпиляторы и трансляторы

  • spirv-cross: инструмент для преобразования SPIR-V обратно в GLSL, HLSL, Metal Shading Language или WGSL.
  • spirv-dis: дизассемблер, выводящий SPIR-V в текстовом формате (читаемый человеком).
  • spirv-val: валидатор, проверяющий корректность SPIR-V-модуля.

Среды разработки

  • RenderDoc: графический отладчик, поддерживающий просмотр и анализ SPIR-V-шейдеров.
  • Vulkan SDK: включает все вышеперечисленные инструменты, а также библиотеки для загрузки SPIR-V (например, vulkan.hpp).

Преимущества и недостатки

Преимущества

  • Переносимость: SPIR-V не зависит от производителя GPU и операционной системы.
  • Производительность: сокращает время загрузки шейдеров, так как драйверу не нужно компилировать исходный код.
  • Безопасность: бинарный формат сложнее модифицировать, чем текст, что снижает риск внедрения вредоносного кода.
  • Гибкость: поддерживает множество языков (GLSL, HLSL, OpenCL C, C++ for OpenCL, SYCL) и может быть расширен через механизм расширений.

Недостатки

  • Сложность отладки: бинарный формат менее читаем, чем исходный код, хотя инструменты вроде spirv-dis частично решают эту проблему.
  • Размер: SPIR-V-файлы могут быть больше, чем эквивалентный сжатый исходный код.
  • Зависимость от драйвера: хотя SPIR-V стандартизирован, драйверы могут по-разному оптимизировать один и тот же код, что приводит к различиям в производительности.

Влияние на индустрию

SPIR-V стал ключевым элементом современной графической экосистемы. Он позволил унифицировать разработку шейдеров для разных API (Vulkan, OpenGL, OpenCL) и платформ (Windows, Linux, macOS, Android, iOS). Благодаря SPIR-V, разработчики игр и приложений могут использовать один и тот же шейдерный код для разных GPU, не беспокоясь о совместимости. Кроме того, SPIR-V способствовал развитию вычислительных шейдеров в Vulkan, что открыло новые возможности для GPGPU-вычислений в играх, научных симуляциях и машинном обучении.

Источники

  • Khronos Group. «SPIR-V Specification» (версия 1.6, 2023).
  • Khronos Group. «Vulkan 1.3 Specification» (2022).
  • John Kessenich, Bojan Ljubisic. «The SPIR-V Intermediate Language» (2016).
  • Документация SPIRV-Tools (GitHub, Khronos Group).
  • Статья «SPIR-V: The Intermediate Language for Vulkan» на сайте GPUOpen (AMD, 2016).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →