Стандартное портативное промежуточное представление
![]() | |
Разработчик(и) | Хронос Групп |
---|---|
Первоначальный выпуск | 2015 |
Стабильная версия | СПИР-В 1.6 / 16 декабря 2021 г |
Операционная система | Кросс-платформенный |
Платформа | Кросс-платформенный |
Тип | Средний язык |
Веб-сайт | www |
Стандартное переносимое промежуточное представление ( SPIR ) — это промежуточный язык для параллельных вычислений и графики, разработанный Khronos Group . Он используется в нескольких средах выполнения, включая Vulkan графический API и вычислительный API OpenCL , для представления шейдера или ядра . Он также используется в качестве языка обмена для кросс-компиляции. [1] [2]
SPIR-V — это новая версия SPIR, представленная в 2015 году группой Khronos и с тех пор заменившая исходный SPIR, представленный в 2012 году.
Цель
[ редактировать ]Целью SPIR-V является естественное представление примитивов, необходимых для вычислений и графики; отделить язык высокого уровня от интерфейса вычислений и графических драйверов; быть формой распространения или распространять полностью скомпилированные двоичные файлы; быть полностью автономной спецификацией; и поддерживать несколько API. Он также используется в качестве промежуточной цели для инструментов кросс-компиляции.
Например, SPIR-V позволяет API Vulkan использовать любой язык шейдеров , включая GLSL и HLSL . [3] [4] SPIR-V можно декомпилировать в несколько языков шейдеров ( GLSL , GLSL ES, MSL , HLSL ) с помощью SPIRV-Cross, так что эти языки можно конвертировать между собой. [5] и/или от них Он также имеет пути к WebGPU , OpenCL , SYCL , C++ и Rust .
На целевых платформах использование SPIR-V устраняет необходимость встраивания исходного компилятора языка высокого уровня в драйверы устройств, что снижает сложность драйверов. [2]
Версии
[ редактировать ]SPIR был первоначально представлен в 2011 году, а SPIR-V — в 2015 году.
СПИР 1.2 | СПИР 2.0 | SPIR-V 1.X | |
---|---|---|---|
LLVM-взаимодействие | ЛЛВМ ИР версия 3.2 | ЛЛВМ ИР версия 3.4 |
|
Вычисление конструкций | Метаданные/Внутренние характеристики | Метаданные/Внутренние характеристики | Родной |
Графические конструкции | Нет | Нет | Родной |
Поддерживаемый язык и поддерживаемые функции | ОпенCL С 1.2 |
|
|
Прием OpenCL | Расширение OpenCL 1.2 | Расширение OpenCL 2.0 | OpenCL 2.1/2.2 ядро |
Прием графического API | — | — |
|
Версии на базе LLVM
[ редактировать ]SPIR до выпуска SPIR-V 2015 года был основан на промежуточном представлении LLVM . Предварительная спецификация SPIR 1.0 была анонсирована в 2012 году. [6] 22 июля 2013 года на выставке SIGGRAPH 2013 была анонсирована предварительная спецификация SPIR 1.2 . [7] Окончательная спецификация SPIR 1.2 была представлена на выставке HiPEAC 2014 21 января 2014 года. [8] 11 августа 2014 года на конференции SIGGRAPH 2014 была представлена предварительная спецификация SPIR 2.0 . [9] SPIR-V не использует LLVM. [2]
SPIR-V
[ редактировать ]SPIR-V 1.0 — это новая версия SPIR, анонсированная в марте 2015 года. [10] и выпущен 16 ноября 2015 г. [11] Семейство SPIR теперь включает настоящий межAPI-стандарт, полностью определенный Khronos, со встроенной поддержкой функций шейдеров и ядра.
Отдельная программа Khronos Group позволяет осуществлять конвертацию с LLVM IR. [12]
Поддержка приема SPIR-V включена в базовую спецификацию OpenCL 2.1, Vulkan API и OpenGL версии 4.6.
Дата | Версия | Примечания |
---|---|---|
18 апреля 2016 г. | 1.1 | Выпущен на IWOCL 2016 вместе с Provisional OpenCL 2.2. В SPIR-V 1.1 добавлена поддержка OpenCL C++, режимов выполнения функций инициализатора/финализатора, именованных барьеров, выполнения подгрупп, каналов области программы и хранилища каналов. [13] |
16 мая 2017 г. | 1.2 | Выпущен на IWOCL 2017 вместе с OpenCL 2.2. В SPIR-V 1.2 добавлена поддержка специализации ключевых параметров настройки во время выполнения в OpenCL 2.2. [14] |
7 марта 2018 г. | 1.3 | Выпущен вместе с Vulkan 1.1 . SPIR-V 1.3 Добавлена поддержка операций подгрупп и улучшена оптимизация компилятора. [15] |
7 мая 2019 г. | 1.4 [1] | |
13 сентября 2020 г. | 1.5 [1] | |
16 декабря 2021 г. | 1.6 [1] |
Функции
[ редактировать ]SPIR-V — это промежуточный язык высокого уровня, обмен которым осуществляется в двоичной форме. Функции представлены графом потока управления базовых блоков с использованием статической формы однократного назначения (SSA). Структуры данных сохраняют иерархическое представление высокого уровня. Он не имеет потерь, как предыдущие байт-коды или промежуточные представления, подобные виртуальным машинам, используемые для графических шейдеров. Это позволяет приблизиться к оптимальной производительности на целевых устройствах. [16]
Расширяемость
[ редактировать ]SPIR-V можно расширить, написав расширения для добавления семантики или зарезервировав диапазоны значений токенов для использования стороной. Поставщики могут самостоятельно добавлять в SPIR-V нужную семантику. [17] Дополнительные наборы расширенных наборов команд могут быть предоставлены в отдельных спецификациях. Несколько наборов можно без проблем импортировать, поскольку расширенные инструкции используются путем указания идентификатора набора и инструкции в наборе. [17]
Шейдеры
[ редактировать ]К отладчикам относятся RenderDoc , SwiftShader и Amber. [18]
Графические шейдеры используют структурированный поток управления в SPIR-V, чтобы указать, как вложены потоки управления. Это помогает определить расхождение и повторную сходимость потока управления в средах параллельного выполнения. [19] Специализация уменьшает количество вариантов шейдера, которые необходимо распространять. [20]
Валидация
[ редактировать ]В спецификации SPIR-V указаны правила, которым необходимо следовать, чтобы иметь действительный модуль SPIR-V. Это позволяет проводить автономную проверку. Драйверы не обязаны обрабатывать недействительные модули SPIR-V. При тестировании тестирование на соответствие проверяет, что драйверы ведут себя правильно при использовании действительного SPIR-V, а валидаторы проверяют, что внешние интерфейсы правильно генерируют SPIR-V. [21]
Связывание
[ редактировать ]SPIR-V может выражать вызовы функций в другом модуле компиляции. Стандартная версия SPIR-V использует эту функцию для вычислительных ядер OpenCL, но не для этапов шейдеров, которые графические API хотят полностью связать в один модуль SPIR-V. [22] Доступны расширения, позволяющие инструментам временно использовать частично связанные шейдеры, а также ядра. [23]
Возможности
[ редактировать ]Модуль SPIR-V используется клиентским API для поддержки функций этого модуля, которые классифицируются по возможностям и объявляются на ранней стадии модуля. Валидатор может подтвердить, что модуль использует только заявленные возможности, а клиентский API может отклонить модули, в которых заявлены неподдерживаемые возможности. [24]
SPIR-V для кросс-компиляции GLSL
[ редактировать ]SPIR-V использовался для работы с несколькими версиями языков исходного уровня. Например, несколько версий языка шейдеров OpenGL (GLSL) требуют распространения нескольких версий шейдеров из-за реализаций, привязанных к конкретной более старой версии GLSL, например, для WebGL 1.0 и реализации Apple OpenGL. Одним из примечательных вариантов использования SPIR-V является его возможность использовать в качестве формата обмена между версиями GLSL с использованием инструментов, поддерживаемых Khronos Group, для компиляции GLSL в SPIR-V. glslangValidator
, [25] optimizing SPIR-V spirv-opt
, [21] и кросс-компиляция в SPIR-V для различных целей GLSL. spirv-cross
. [26]
Однако как формат SPIR-V имеет некоторые ограничения для кросс-компиляции, включая требование, чтобы каждый модуль SPIR-V имел хотя бы один символ точки входа. Это не позволяет легко использовать формат для отдельной компиляции, где сложные шейдеры могут быть собраны с помощью серии шагов частичной компиляции, за которыми следует этап компоновки. Это противоречит заявленным целям некоторых инструментов SPIR-V, таких как spirv-link
, [21] целью которого является обеспечение полной функциональности связывания двоичного кода SPIR-V.
См. также
[ редактировать ]- Язык шейдеров высокого уровня (HLSL)
- Cg (язык программирования)
- Язык шейдеров OpenGL (GLSL)
- Инфраструктура вольфрамовых графических шейдеров
- Вычислительное ядро
- Параллельное выполнение потоков
- язык ассемблера АРБ
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д «Реестр Khronos SPIR-V — The Khronos Group Inc» . www.khronos.org . Проверено 16 января 2024 г.
- ^ Перейти обратно: а б с Терцо, Оливер; Джемаме, Карим; Сционти, Альберт; Песуэла, Клара (10 сентября 2019 г.). Гетерогенные вычислительные архитектуры: проблемы и перспективы . ЦРК Пресс. ISBN 9780429680038 . Проверено 24 июня 2022 г.
- ^ «Шейдерные модули» . Учебник по Вулкану .
- ^ «HLSL как первоклассный язык шейдинга Vulkan» . Группа «Хронос» . 15 января 2020 г.
- ^ KhronosGroup/SPIRV-Cross , The Khronos Group, 2019-09-06 , retrieved 2019-09-08
- ^ Ларабель, Майкл (12 сентября 2012 г.). «Khronos SPIR для OpenCL обеспечивает двоичную совместимость» . Фороникс . Проверено 25 июля 2015 г.
- ^ Смит, Райан (22 июля 2013 г.). «Хронос @ SIGGRAPH 2013: анонсированы OpenGL 4.4, OpenCL 2.0 и OpenCL 1.2 SPIR» . Анандтех . Проверено 5 апреля 2015 г.
- ^ «Khronos выпускает спецификацию SPIR 1.2 для переносимого кодирования программ устройств OpenCL» . Группа «Хронос» . 20 января 2014 г. Проверено 5 августа 2019 г.
- ^ Смит, Райан (11 августа 2014 г.). «Хронос анонсирует OpenCL SPIR 2.0» . Анандтех . Проверено 5 апреля 2015 г.
- ^ Паркерсон, Стюарт (4 марта 2015 г.). «Khronos Group представляет новый API-интерфейс аппаратного драйвера Vulkan и промежуточный язык SPIR-V, общий для Vulkan и OpenCL 2.1» . Журнал для разработчиков приложений . Проверено 5 апреля 2015 г.
- ^ «Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования» . www.Хронос.орг . 16 ноября 2015 года . Проверено 16 ноября 2015 г.
- ^ «SPIRV-LLVM-Translator: инструмент и библиотека для двунаправленной трансляции между SPIR-V и LLVM IR» . Гитхаб . Группа «Хронос».
- ^ Треветт, Нил (18 апреля 2016 г.). «OpenCL: Состояние страны (IWOCL 2016)» (PDF) . Группа компаний «Хронос» .
- ^ Треветт, Нил (16 мая 2017 г.). «Состояние страны по OpenCL (IWOCL 2017)» (PDF) . ИВОКЛ .
- ^ «SPIR — промежуточный язык открытого стандарта для параллельных вычислений и графики» . Группа «Хронос» . 20 января 2014 г. Проверено 5 августа 2019 г.
- ^ Кессенич, Джон. «Введение в SPIR-V» (PDF) . Хронос . Проверено 25 июля 2015 г.
- ^ Перейти обратно: а б «СПИРВ-Гид» . github.com . Проверено 24 июня 2022 г.
- ^ «Среда тестирования шейдеров с несколькими API с открытым исходным кодом Google 'Amber'» . phoronix.com . Проверено 24 июня 2022 г.
- ^ «Спецификация SPIR-V: структурированный поток управления» . khronos.org . Проверено 24 июня 2022 г.
- ^ «Константы специализации» . veldrid.dev . Проверено 24 июня 2022 г.
- ^ Перейти обратно: а б с «Инструменты СПИР-В» . www.github.com . Проверено 01 октября 2020 г.
- ^ «Основы шейдеров» . Informit.com . Проверено 24 июня 2022 г.
- ^ «Расширение SPIR-V для Visual Studio» . saschawillems.de . Проверено 24 июня 2022 г.
- ^ «Спецификация SPIR-V: языковые возможности» . khronos.org . Проверено 24 июня 2022 г.
- ^ «Справочный компилятор OpenGL/OpenGL ES» . www.khronos.org . Проверено 01 октября 2020 г.
- ^ «Кросс СПИР-В» . www.github.com . Проверено 01 октября 2020 г.