stringtranslate.com

Стандартное портативное промежуточное представление

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

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

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

Цель

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

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


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

Версии

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

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

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

СПИР-В

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

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

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

Функции

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

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

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

Шейдеры

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

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

Проверка

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

Связывание

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

Возможности

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

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

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

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

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

Ссылки

  1. ^ abcd "Реестр Khronos SPIR-V - The Khronos Group Inc". www.khronos.org . Получено 2024-01-16 .
  2. ^ abc Терцо, Оливье; Джемаме, Карим; Сционти, Альберто; Песуэла, Клара (10 сентября 2019 г.). Гетерогенные вычислительные архитектуры: проблемы и перспективы. ЦРК Пресс. ISBN 9780429680038. Получено 24 июня 2022 г. .
  3. ^ Бинеман, Крис (19 сентября 2024 г.). «DirectX принимает SPIR-V как формат обмена будущего». Блог разработчиков DirectX . Получено 19 сентября 2024 г.
  4. ^ «Шейдерные модули». Учебник по Вулкану .
  5. ^ "HLSL как первоклассный язык шейдеров Vulkan". Группа Khronos . 15 января 2020 г.
  6. ^ KhronosGroup/SPIRV-Cross, Группа Khronos, 2019-09-06 , получено 2019-09-08
  7. ^ Ларабель, Майкл (12 сентября 2012 г.). «Khronos SPIR для OpenCL обеспечивает двоичную совместимость». Phoronix . Получено 25 июля 2015 г. .
  8. ^ Смит, Райан (22 июля 2013 г.). "Khronos @ SIGGRAPH 2013: OpenGL 4.4, OpenCL 2.0 и OpenCL 1.2 SPIR анонсированы". Anandtech . Получено 5 апреля 2015 г.
  9. ^ "Khronos выпускает спецификацию SPIR 1.2 для переносимого кодирования программ устройств OpenCL". Группа Khronos . 2014-01-20 . Получено 05.08.2019 .
  10. ^ Смит, Райан (11 августа 2014 г.). "Khronos анонсирует OpenCL SPIR 2.0". Anandtech . Получено 5 апреля 2015 г. .
  11. ^ Паркерсон, Стюарт (4 марта 2015 г.). «Khronos Group представляет новый API драйвера оборудования Vulkan и промежуточный язык SPIR-V, используемый Vulkan и OpenCL 2.1». App Developer Magazine . Получено 5 апреля 2015 г.
  12. ^ "Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования". www.Khronos.org . 16 ноября 2015 г. . Получено 16 ноября 2015 г. .
  13. ^ "SPIRV-LLVM-Translator: Инструмент и библиотека для двунаправленного перевода между SPIR-V и LLVM IR". GitHub . Группа Khronos.
  14. ^ Треветт, Нил (18 апреля 2016 г.). "OpenCL: состояние страны (IWOCL 2016)" (PDF) . Khronos Group .
  15. ^ Треветт, Нил (16 мая 2017 г.). «OpenCL State of the Nation (IWOCL 2017)» (PDF) . IWOCL .
  16. ^ "SPIR - отраслевой открытый стандартный промежуточный язык для параллельных вычислений и графики". Группа Khronos . 2014-01-20 . Получено 05.08.2019 .
  17. ^ Кессенич, Джон. «Введение в SPIR-V» (PDF) . Хронос . Проверено 25 июля 2015 г.
  18. ^ ab "SPIRV-Guide". github.com . Получено 24 июня 2022 г. .
  19. ^ "Google Open-Sources 'Amber' Multi-API Shader Test Framework". phoronix.com . Получено 24 июня 2022 г. .
  20. ^ "Спецификация SPIR-V: Структурированный поток управления". khronos.org . Получено 24 июня 2022 г. .
  21. ^ "Константы специализации". veldrid.dev . Получено 24 июня 2022 г. .
  22. ^ abc "SPIR-V Tools". www.github.com . Получено 2020-10-01 .
  23. ^ "Shader Fundamentals". informit.com . Получено 24 июня 2022 г. .
  24. ^ "Расширение SPIR-V для Visual Studio". saschawillems.de . Получено 24 июня 2022 г. .
  25. ^ "SPIR-V Specification: Language Capabilities". khronos.org . Получено 24 июня 2022 г. .
  26. ^ "OpenGL / OpenGL ES Reference Compiler". www.khronos.org . Получено 2020-10-01 .
  27. ^ "SPIR-V Cross". www.github.com . Получено 2020-10-01 .

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