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

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

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

Цель

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

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

Версии

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

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

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

Вычислительные конструкцииМетаданные / Внутренние функцииМетаданные / Внутренние функцииРодные
Графические конструкцииНетНетРодные
Поддерживаемый язык и поддерживаемые функцииOpenCL C 1.2OpenCL C 1.2

OpenCL C 2.0

OpenCL C 1.2 / 2.X

OpenCL C ++

GLSL

Прием OpenCLРасширение OpenCL 1.2Расширение OpenCL 2.0OpenCL 2.1 / 2.2 Ядро
Загрузка графического APINANAВулкан 1.X

OpenGL 4.6 Ядро

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

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

СПИР-В

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

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

Поддержка приема 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 ++, режимов выполнения функций инициализатора / финализатора, именованных барьеров, выполнения подгрупп, каналов области действия программы и хранилища каналов.[15]

СПИР-В 1.2

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

СПИР-В 1.3

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

СПИР-В 1.4

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

СПИР-В 1.5

13 сентября 2019 года вышел SPIR-V 1.5.[19]

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

Последующие версии Язык шейдинга OpenGL (GLSL) представил ряд обратно несовместимых языковых изменений. В результате шейдеры GLSL, предназначенные для нескольких версий OpenGL, перезаписываются один раз для каждой версии, что усугубляется практическими проблемами совместимости из-за реализаций, привязанных к конкретной более старой версии GLSL, например для WebGL 1.0 и реализация Apple OpenGL. Одним из примечательных вариантов использования SPIR-V является его способность использоваться в качестве формата обмена между версиями GLSL с использованием инструментов, поддерживаемых Хронос Групп для компиляции GLSL в SPIR-V glslangValidator[20], оптимизируя SPIR-V spirv-opt[21]и кросс-компиляция в SPIR-V для разных целей GLSL крест-дух[22].

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

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

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

  1. ^ Фарбер, Роб (11 августа 2014 г.). «Коммерческий OpenCL! SPIR 2.0 защищает IP, но позволяет использовать мощные, портативные ядра без исходного кода». TechEnablement. Получено 5 апреля 2015.
  2. ^ Треветт, Нил. «Обзор и обновление OpenCL» (PDF).
  3. ^ «Шейдерные модули». Учебник по Vulkan.
  4. ^ "HLSL как язык затенения Vulkan первого класса". Группа Хронос. 15 января 2020.
  5. ^ ХроносГрупп / СПИРВ-Кросс, Группа Хронос, 2019-09-06, получено 2019-09-08
  6. ^ Спецификация языка шейдинга WebGPU
  7. ^ Ларабель, Майкл (12 сентября 2012 г.). "Khronos SPIR для OpenCL обеспечивает двоичную совместимость". Фороникс. Получено 25 июля 2015.
  8. ^ Смит, Райан (22 июля 2013 г.). «Khronos @ SIGGRAPH 2013: анонсированы OpenGL 4.4, OpenCL 2.0 и OpenCL 1.2 SPIR». Анандтех. Получено 5 апреля 2015.
  9. ^ «Khronos выпускает спецификацию SPIR 1.2 для переносимого кодирования программ устройств OpenCL». Группа Хронос. 2014-01-20. Получено 2019-08-05.
  10. ^ Смит, Райан (11 августа 2014 г.). «Хронос анонсирует OpenCL SPIR 2.0». Анандтех. Получено 5 апреля 2015.
  11. ^ Паркерсон, Стюарт (4 марта 2015 г.). «Группа Khronos представляет новый API аппаратного драйвера Vulkan и промежуточный язык SPIR-V, который используется совместно Vulkan и OpenCL 2.1». Журнал для разработчиков приложений. Получено 5 апреля 2015.
  12. ^ «Khronos выпускает спецификации OpenCL 2.1 и SPIR-V 1.0 для гетерогенного параллельного программирования». www.Khronos.org. 16 ноября 2015 г.. Получено 16 ноября 2015.
  13. ^ Кессенич, Джон. «Введение в SPIR-V» (PDF). Хронос. Получено 25 июля 2015.
  14. ^ «SPIRV-LLVM-Translator: инструмент и библиотека для двунаправленного перевода между SPIR-V и LLVM IR». GitHub. Группа Хронос.
  15. ^ Треветт, Нил (18 апреля 2016 г.). "OpenCL Государство Союза (IWOCL 2016)" (PDF). Хронос Групп.
  16. ^ Треветт, Нил (16 мая 2017 г.). «Состояние нации OpenCL (IWOCL 2017)» (PDF). IWOCL.
  17. ^ «SPIR - отраслевой открытый стандартный промежуточный язык для параллельных вычислений и графики». Группа Хронос. 2014-01-20. Получено 2019-08-05.
  18. ^ "Реестр Хронос СПИР-В - Хронос Групп Инк". www.khronos.org. Получено 2019-08-05.
  19. ^ "Реестр Хронос СПИР-В - Хронос Групп Инк". www.khronos.org. Получено 2020-01-30.
  20. ^ "Эталонный компилятор OpenGL / OpenGL ES". www.khronos.org. Получено 2020-10-01.
  21. ^ «Инструменты СПИР-В». www.github.com. Получено 2020-10-01.
  22. ^ "СПИР-В Кросс". www.github.com. Получено 2020-10-01.
  23. ^ «Инструменты СПИР-В». www.github.com. Получено 2020-10-01.

внешняя ссылка