Стандартное портативное промежуточное представление - Standard Portable Intermediate Representation

SPIR
SPIR logo.svg
Разработчики) Хронос Групп
Первый выпуск Январь 2014  ( 2014-01 )
Стабильный выпуск
SPIR-V 1.5 / 13 сентября 2019 г . ; 19 месяцев назад  ( 2019-09-13 )
Операционная система Кроссплатформенность
Платформа Кроссплатформенность
Тип Средний язык
Веб-сайт www .khronos .org / spir

Стандартное переносимое промежуточное представление ( SPIR ) - это промежуточный язык для параллельных вычислений и графики от Khronos Group , изначально разработанный для использования с OpenCL . SPIR был переписан в SPIR-V в марте 2015 года.

Цель

OpenCL использует своевременную компиляцию (JIT), что требует одного из двух шаблонов распространения программного обеспечения : разработчики могут распространять предварительно скомпилированные двоичные файлы для конкретных устройств или они могут распространять соответствующий исходный код , что ограничено желанием защитить интеллектуальную собственность . SPIR позволяет создавать и распространять независимые от устройств двоичные файлы в стеке OpenCL. Автономный характер компиляции также позволяет более гибко улучшать язык, например использовать новые функции C ++.

Что еще более важно, SPIR-V позволяет API Vulkan использовать любой язык затенения , включая GLSL и HLSL . SPIR-V может быть скомпилирован в несколько языков затенения ( GLSL , GLSL ES, MSL , HLSL ) с помощью SPIRV-Cross, так что эти языки могут быть взаимно преобразованы. Язык текстового затенения WebGPU разработан как тонкий слой поверх SPIR-V.

Версии

Первоначально SPIR был представлен в 2011 году, а SPIR-V был представлен в 2015 году.

СПИР и СПИР-V
SPIR 1.2 SPIR 2.0 SPIR-V 1.X
LLVM взаимодействие LLVM IR версии 3.2 LLVM IR версии 3.4 100% определение Хроноса

Преобразование без потерь в оба конца

Вычислительные конструкции Метаданные / Внутренние функции Метаданные / Внутренние функции Родной
Графические конструкции Нет Нет Родной
Поддерживаемый язык и поддерживаемые функции 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.0 OpenCL 2.1 / 2.2 Ядро
Загрузка графического API NA NA Вулкан 1.X

OpenGL 4.6 Ядро

Версии на основе LLVM

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

СПИР-В

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

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

Поддержка загрузки SPIR-V включена в основную спецификацию OpenCL 2.1, API Vulkan и OpenGL версии 4.6.

SPIR-V 1.1

18 апреля 2016 года SPIR-V 1.1 был выпущен на IWOCL 2016 вместе с Provisional OpenCL 2.2. В SPIR-V 1.1 добавлена ​​поддержка OpenCL C ++, режимов выполнения функций инициализатора / финализатора, именованных барьеров, выполнения подгрупп, каналов области действия программы и хранилища каналов.

СПИР-В 1.2

16 мая 2017 года SPIR-V 1.2 был выпущен на IWOCL 2017 вместе с OpenCL 2.2. В SPIR-V 1.2 добавлена ​​поддержка специализации времени выполнения ключевых параметров настройки в OpenCL 2.2.

СПИР-В 1.3

7 марта 2018 года был выпущен SPIR-V 1.3 вместе с Vulkan 1.1 . SPIR-V 1.3 Добавлена ​​поддержка операций с подгруппами и предусмотрена расширенная оптимизация компилятора.

СПИР-В 1.4

7 мая 2019 года был выпущен SPIR-V 1.4.

СПИР-В 1.5

13 сентября 2019 года был выпущен SPIR-V 1.5.

SPIR-V для кросс-компиляции GLSL

Последующие версии OpenGL Shading Language (GLSL) представили ряд обратно несовместимых языковых изменений. В результате шейдеры GLSL, нацеленные на несколько версий OpenGL, перезаписываются один раз для каждой версии, что усугубляется практическими проблемами совместимости из-за реализаций, привязанных к конкретной более старой версии 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 может использоваться только для создания исполняемых файлов, но не для объектных файлов .o , общих объектных файлов .so или статических библиотек .a . Это противоречит заявленным целям некоторых инструментов SPIR-V, таких как spirv-link , который направлен на обеспечение полной функциональности связывания для двоичного кода SPIR-V.

Смотрите также

Рекомендации

Внешние ссылки