Меню

Главная
Случайная статья
Настройки
SPIR-V
Материал из https://ru.wikipedia.org

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]

Содержание

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

Цели 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]

Версии

Изначально 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.
Релизы SPIR-V
Дата Версия Примечания
18 апреля 2016 1.1 Выпущен на IWOCL 2016[англ.] вместе с предварительной версией OpenCL 2.2. В SPIR-V 1.1 добавлена поддержка OpenCL C++, режимов выполнения функций инициализатора/финализатора, именованных барьеров, выполнения подгрупп, труб программной области и хранения труб.[15]
16 мая 2017 1.2 Выпущен на IWOCL 2017[англ.] вместе с OpenCL 2.2. В SPIR-V 1.2 добавлена поддержка специализации во время выполнения ключевых параметров настройки в OpenCL 2.2.[16]
7 марта 2018 1.3 Выпущен вместе с Vulkan 1.1. В SPIR-V 1.3 добавлена поддержка операций с подгруппами и улучшена оптимизация компилятора.[17]
7 мая 2019 1.4[2]
13 сентября 2020 1.5[2]
16 декабря 2021 1.6[2]


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

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]

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.

См. также

Ссылки
  1. 1 2 https://www.nationalarchives.gov.uk/PRONOM/fmt/1996
  2. 1 2 3 4 Khronos SPIR-V Registry - The Khronos Group Inc. www.khronos.org. Дата обращения: 16 января 2024.
  3. 1 2 3 Terzo, Olivier. Heterogeneous Computing Architectures: Challenges and Vision / Olivier Terzo, Karim Djemame, Alberto Scionti … [и др.]. — CRC Press, 10 September 2019. — ISBN 9780429680038.
  4. Bieneman, Chris. DirectX Adopting SPIR-V as the Interchange Format of the Future. DirectX Developer Blog (19 сентября 2024). Дата обращения: 19 сентября 2024.
  5. Shader modules. Vulkan Tutorial.
  6. HLSL as a First Class Vulkan Shading Language (англ.). The Khronos Group (15 января 2020).
  7. KhronosGroup/SPIRV-Cross, The Khronos Group, 6 сентября 2019, Дата обращения: 8 сентября 2019
  8. Larabel, Michael. Khronos SPIR For OpenCL Brings Binary Compatibility. Phoronix (12 сентября 2012). Дата обращения: 25 июля 2015.
  9. Smith, Ryan. Khronos @ SIGGRAPH 2013: OpenGL 4.4, OpenCL 2.0, & OpenCL 1.2 SPIR Announced. Anandtech (22 июля 2013). Дата обращения: 5 апреля 2015.
  10. Khronos Releases SPIR 1.2 Specification for Portable Encoding of OpenCL Device Programs (англ.). The Khronos Group (20 января 2014). Дата обращения: 5 августа 2019.
  11. Smith, Ryan. Khronos Announces OpenCL SPIR 2.0. Anandtech (11 августа 2014). Дата обращения: 5 апреля 2015.
  12. Parkerson, Stuart. Khronos Group Introduces New Vulkan Hardware Driver API and SPIR-V Intermediate Language Shared by Vulkan and OpenCL 2.1. App Developer Magazine (4 марта 2015). Дата обращения: 5 апреля 2015.
  13. Khronos Releases OpenCL 2.1 and SPIR-V 1.0 Specifications for Heterogeneous Parallel Programming. www.Khronos.org (16 ноября 2015). Дата обращения: 16 ноября 2015.
  14. SPIRV-LLVM-Translator: A tool and a library for bi-directional translation between SPIR-V and LLVM IR. GitHub. The Khronos Group.
  15. Trevett, Neil. OpenCL A State of the Union (IWOCL 2016). Khronos Group (18 апреля 2016).
  16. Trevett, Neil. OpenCL State of the Nation (IWOCL 2017). IWOCL (16 мая 2017).
  17. SPIR - The Industry Open Standard Intermediate Language for Parallel Compute and Graphics (англ.). The Khronos Group (20 января 2014). Дата обращения: 5 августа 2019.
  18. Kessenich, John. An Introduction to SPIR-V. Khronos. Дата обращения: 25 июля 2015.
  19. 1 2 SPIRV-Guide. github.com. Дата обращения: 24 июня 2022.
  20. Google Open-Sources 'Amber' Multi-API Shader Test Framework. phoronix.com. Дата обращения: 24 июня 2022.
  21. SPIR-V Specification: Structured Control Flow. khronos.org. Дата обращения: 24 июня 2022.
  22. Specialization Constants. veldrid.dev. Дата обращения: 24 июня 2022.
  23. 1 2 3 SPIR-V Tools. www.github.com. Дата обращения: 1 октября 2020.
  24. Shader Fundamentals. informit.com. Дата обращения: 24 июня 2022.
  25. SPIR-V Extension for Visual Studio. saschawillems.de. Дата обращения: 24 июня 2022.
  26. SPIR-V Specification: Language Capabilities. khronos.org. Дата обращения: 24 июня 2022.
  27. OpenGL / OpenGL ES Reference Compiler. www.khronos.org. Дата обращения: 1 октября 2020.
  28. SPIR-V Cross. www.github.com. Дата обращения: 1 октября 2020.


Ссылки
Downgrade Counter