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

SPIR-V это новая версия SPIR, которая была представлена в 2015 году Khronos Group и с тех пор заменила оригинальную SPIR, которая была представлена в 2012 году.

19 сентября 2024 года компания Microsoft объявила о планах принять SPIR-V в качестве Direct3D-формата обмена данными вместо DXIL начиная поддержку с Shader Model 7.

Предназначение Цели SPIR-V — естественное представление примитивов, необходимых для вычислений и графики; отделение языка высокого уровня от интерфейса драйверов вычислений и графики; форма распространения или распространение полностью скомпилированных двоичных файлов; полностью самодостаточная спецификация; и поддержка множества API. Он также используется в качестве промежуточной цели для инструментов кросс-компиляции.

Например, SPIR-V позволяет Vulkan API использовать любой , включая GLSL и HLSL. SPIR-V может быть декомпилирован в несколько языков затенения (GLSL, GLSL ES, , HLSL) с помощью SPIRV-Cross, чтобы эти языки могли быть интерконвертированы. В нём также есть пути к WebGPU, OpenCL, , C++ и Rust.

В целевых платформах включение SPIR-V устраняет необходимость встраивать компилятор исходных текстов на языке высокого уровня в драйверы устройств, что снижает сложность драйверов.

Версии Изначально SPIR был представлен в 2011 году, а SPIR-V — в 2015 году. + SPIR and SPIR-VSPIR 1.2SPIR 2.0SPIR-V 1.XВзаимодействие с LLVMLLVM IR версии 3.2LLVM IR версии 3.4 100 % преобразование без потерь по кругу, определённое KhronosВычислительные конструкцииМетаданные/ИнтринсикиМетаданные/ИнтринсикиРодныеГрафические конструкцииРодныеПоддерживаемые языки и функции OpenCL C 1.2 OpenCL C 1.2 OpenCL C 2.0 OpenCL C 1.2 / 2.X OpenCL C++ GLSLЗагрузка OpenCLРасширение OpenCL 1.2Расширение OpenCL 2.0OpenCL 2.1/2.2 CoreЗагрузка графического API Vulkan 1.X OpenGL 4.6 Core

Версии на основе LLVM SPIR до выхода SPIR-V в 2015 году был основан на LLVM. Предварительная спецификация SPIR 1.0 была анонсирована в 2012 году. 22 июля 2013 года на SIGGRAPH 2013 была анонсирована предварительная спецификация SPIR 1.2. Финальная спецификация SPIR 1.2 была выпущена на HiPEAC 2014 21 января 2014 года. 11 августа 2014 года на SIGGRAPH 2014 была выпущена предварительная спецификация SPIR 2.0. SPIR-V не использует LLVM.

SPIR-V SPIR-V 1.0 — это новая версия SPIR, анонсированная в марте 2015 года и выпущенная 16 ноября 2015 года. Семейство SPIR теперь включает в себя настоящий кросс-API стандарт, полностью определённый Khronos, с собственной поддержкой шейдеров и функций ядра.

Отдельная программа, разработанная Khronos Group, позволяет осуществлять интерконверсию с LLVM.

Поддержка приема SPIR-V включена в базовую спецификацию OpenCL 2.1, Vulkan API и OpenGL версии 4.6. +Релизы SPIR-VДатаВерсияПримечания18 апреля 20161.1Выпущен на вместе с предварительной версией OpenCL 2.2. В SPIR-V 1.1 добавлена поддержка OpenCL C++, режимов выполнения функций инициализатора/финализатора, именованных барьеров, выполнения подгрупп, труб программной области и хранения труб.16 мая 20171.2Выпущен на вместе с OpenCL 2.2. В SPIR-V 1.2 добавлена поддержка специализации во время выполнения ключевых параметров настройки в OpenCL 2.2.7 марта 20181.3Выпущен вместе с Vulkan 1.1. В SPIR-V 1.3 добавлена поддержка операций с подгруппами и улучшена оптимизация компилятора.7 мая 20191.413 сентября 20201.516 декабря 20211.6

Характеристики SPIR-V — это высокоуровневый промежуточный язык, обмен данными на котором осуществляется в двоичной форме. Функции представляются в виде графа потока управления базовых блоков, использующих статическое одиночное присваивание (SSA). Структуры данных сохраняют высокоуровневое иерархическое представление. Оно не имеет потерь, как предыдущие промежуточные представления в виде байт-кода или виртуальной машины, используемые для графических шейдеров. Это позволяет добиться более близкой к оптимальной производительности на целевых устройствах.

Расширяемость SPIR-V может быть расширен путем написания расширений для добавления семантики или резервирования диапазонов значений маркера для использования стороной. Поставщики могут самостоятельно добавлять желаемые семантики в SPIR-V. Дополнительные наборы расширенных инструкций могут быть представлены в отдельных спецификациях. Несколько наборов можно импортировать без проблем, так как расширенные инструкции используются путем указания идентификатора набора и инструкции в наборе.

Шейдеры Отладчики включают , SwiftShader и Amber.

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

Валидация В спецификации SPIR-V указаны правила, которые необходимо соблюдать, чтобы модуль SPIR-V был действительным. Это позволяет проводить проверку в автономном режиме. Драйверы не обязаны работать с недействительными модулями SPIR-V. При тестировании тестирование на соответствие проверяет правильность поведения драйверов при потреблении валидных SPIR-V, а валидаторы проверяют правильность генерации SPIR-V внешними устройствами.

Ссылка SPIR-V может выражать вызовы функций в другой единице компиляции. В стандартной версии SPIR-V эта возможность используется для вычислительных ядер OpenCL, но не для шейдерных стадий, которые графические API хотят полностью связать в один модуль SPIR-V. Существуют расширения, позволяющие инструментам временно использовать частично связанные шейдеры, а также ядра.

Возможности Модуль SPIR-V используется клиентским API для поддержки функций модуля, которые классифицируются через возможности и объявляются в самом начале модуля. Валидатор может подтвердить, что модуль использует только заявленные возможности, а клиентский API может отклонить модули, в которых заявлены неподдерживаемые возможности.

SPIR-V для кросс-компиляции GLSL SPIR-V используется для работы с несколькими версиями языков с исходным кодом. Например, многочисленные версии языка затенения OpenGL (GLSL) требуют распространения нескольких версий шейдеров из-за реализаций, привязанных к конкретной старой версии GLSL, например, для WebGL 1.0 и реализации OpenGL от Apple. Одним из важных примеров использования SPIR-V является его способность использоваться в качестве формата обмена между версиями GLSL, используя инструменты, поддерживаемые Khronos Group для компиляции GLSL в SPIR-V glslangValidator, оптимизация SPIR-V spirv-opt, и кросс-компиляция в SPIR-V для различных целей GLSL spirv-cross.

Однако, как формат, SPIR-V имеет некоторые ограничения для кросс-компиляции, включая требование, чтобы каждый модуль SPIR-V имел по крайней мере один символ точки входа. Это не позволяет легко использовать формат для раздельной компиляции, где сложные шейдеры могут быть собраны серией частичных шагов компиляции, за которыми следует шаг связывания. Это противоречит заявленным целям некоторых инструментов SPIR-V, таких как spirv-link, which aims to provide full linking functionality for SPIR-V binary code.

См. также HLSL Cg OpenGL Shading Language (GLSL) Tungsten Graphics Shader Infrastructure

Parallel Thread Execution

Примечания

Ссылки Khronos SPIR webpage SPIR-V specification

Категория:Компиляторы