Лучшие вопросы
Таймлайн
Чат
Перспективы

SPIR-V

Из Википедии, свободной энциклопедии

SPIR-V
Remove ads

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

Краткие факты Тип, Автор ...

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

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

Remove ads

Предназначение

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

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

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

Remove ads

Версии

Суммиров вкратце
Перспектива

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

SPIR and SPIR-V
SPIR 1.2 SPIR 2.0 SPIR-V 1.X
Взаимодействие с LLVM LLVM IR версии 3.2 LLVM 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.0 OpenCL 2.1/2.2 Core
Загрузка графического API н/д н/д
Vulkan 1.X
OpenGL 4.6 Core

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

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

SPIR-V

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

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

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

Подробнее Дата, Версия ...
Remove ads

Характеристики

Суммиров вкратце
Перспектива

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

Расширяемость

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

Шейдеры

Отладчики включают RenderDoc[англ.], SwiftShader и Amber.[20]

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

Валидация

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

Ссылка

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

Возможности

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

Remove ads

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

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

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

Remove ads

См. также

Ссылки

Ссылки

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads