Standard Portable Intermediate Representation ( SPIR ) es un lenguaje intermedio para cómputo y gráficos en paralelo de Khronos Group , desarrollado originalmente para su uso con OpenCL . SPIR se reescribió en SPIR-V en marzo de 2015.
Desarrollador (es) | Grupo Khronos |
---|---|
Versión inicial | Enero 2014 |
Lanzamiento estable | SPIR-V 1.5 / 13 de septiembre de 2019 |
Sistema operativo | Multiplataforma |
Plataforma | Multiplataforma |
Tipo | Idioma intermedio |
Sitio web | www |
Propósito
OpenCL utiliza la compilación justo a tiempo (JIT), lo que requiere uno de dos patrones de distribución de software : los desarrolladores pueden distribuir binarios precompilados específicos del dispositivo o pueden distribuir código fuente relevante , que está limitado por el deseo de proteger la propiedad intelectual . SPIR permite la creación y distribución de binarios independientes del dispositivo dentro de la pila OpenCL. [1] La naturaleza fuera de línea de la compilación también permite mejoras de lenguaje más flexibles, como el uso de nuevas funciones de C ++. [2]
Más importante aún, SPIR-V permite que la API de Vulkan use cualquier lenguaje de sombreado , incluidos GLSL y HLSL . [3] [4] SPIR-V se puede compilar en varios lenguajes de sombreado ( GLSL , GLSL ES, MSL , HLSL ) usando SPIRV-Cross, de modo que estos lenguajes se pueden interconvertir. [5] El lenguaje de sombreado textual de WebGPU está diseñado como una capa delgada sobre SPIR-V. [6]
Versiones
SPIR se introdujo originalmente en 2011 y SPIR-V se introdujo en 2015.
SPIR 1.2 | SPIR 2.0 | SPIR-V 1.X | |
---|---|---|---|
Interacción LLVM | LLVM IR versión 3.2 | LLVM IR versión 3.4 | 100% Khronos definido Conversión sin pérdidas de ida y vuelta |
Computar construcciones | Metadatos / intrínsecos | Metadatos / intrínsecos | Nativo |
Construcciones gráficas | No | No | Nativo |
Idioma y función admitidos admitidos | OpenCL C 1.2 | OpenCL C 1.2 OpenCL C 2.0 | OpenCL C 1.2 / 2.X OpenCL C ++ GLSL |
Ingestión de OpenCL | Extensión OpenCL 1.2 | Extensión OpenCL 2.0 | OpenCL 2.1 / 2.2 Core |
Ingestión de API de gráficos | N / A | N / A | Vulkan 1.X Núcleo de OpenGL 4.6 |
Versiones basadas en LLVM
SPIR antes del lanzamiento de SPIR-V de 2015 se basó en la Representación intermedia de LLVM . En 2012 se anunció una especificación provisional para SPIR 1.0 [7] El 22 de julio de 2013, se anunció una especificación provisional SPIR 1.2 en SIGGRAPH 2013 . [8] La especificación final SPIR 1.2 se publicó en HiPEAC 2014 el 21 de enero de 2014. [9] El 11 de agosto de 2014, se publicó una especificación provisional para SPIR 2.0 en SIGGRAPH 2014 . [10]
SPIR-V
SPIR-V 1.0 es una versión reescrita de SPIR anunciada en marzo de 2015, [11] y lanzada el 16 de noviembre de 2015. [12] La familia SPIR ahora incluye un verdadero estándar de API cruzadas completamente definido por Khronos con soporte nativo para funciones de sombreado y kernel.
SPIR-V es un lenguaje intermedio de alto nivel, intercambiado en forma binaria. Las funciones se representan mediante un gráfico de flujo de control de bloques básicos, utilizando el formulario de asignación única estática (SSA). Las estructuras de datos conservan la representación jerárquica de alto nivel. No tiene pérdidas como el código de bytes anterior o las representaciones intermedias similares a máquinas virtuales utilizadas para los sombreadores gráficos. Esto permite un rendimiento más cercano al óptimo en los dispositivos de destino. [13] Un programa separado del Khronos Group permite la interconversión con LLVM IR. [14]
La compatibilidad con la ingestión de SPIR-V está incorporada en la especificación principal de OpenCL 2.1, la API de Vulkan y la versión 4.6 de OpenGL .
SPIR-V 1.1
El 18 de abril de 2016, SPIR-V 1.1 se lanzó en IWOCL 2016 junto con Provisional OpenCL 2.2. SPIR-V 1.1 agregó soporte para OpenCL C ++, modos de ejecución de funciones de inicializador / finalizador, barreras con nombre, ejecución de subgrupos, canalizaciones de alcance de programa y almacenamiento de canalizaciones. [15]
SPIR-V 1.2
El 16 de mayo de 2017, SPIR-V 1.2 se lanzó en IWOCL 2017 junto con OpenCL 2.2. SPIR-V 1.2 agregó soporte para la especialización en tiempo de ejecución de los parámetros de ajuste clave en OpenCL 2.2. [dieciséis]
SPIR-V 1.3
El 7 de marzo de 2018, se lanzó SPIR-V 1.3 junto con Vulkan 1.1 . SPIR-V 1.3 Se agregó soporte para operaciones de subgrupos y permite optimizaciones mejoradas del compilador. [17]
SPIR-V 1.4
El 7 de mayo de 2019, se lanzó SPIR-V 1.4. [18]
SPIR-V 1.5
El 13 de septiembre de 2019, se lanzó SPIR-V 1.5. [19]
SPIR-V para compilación cruzada GLSL
Las versiones posteriores del lenguaje de sombreado OpenGL (GLSL) introdujeron una serie de cambios de idioma incompatibles con versiones anteriores. Como resultado, los sombreadores GLSL que apuntan a múltiples versiones de OpenGL se reescriben una vez para cada versión, lo que se ve agravado por problemas de compatibilidad práctica debido a implementaciones vinculadas a una versión anterior específica de GLSL, como para WebGL 1.0 y la implementación de OpenGL de Apple. Uno de los casos de uso notables de SPIR-V es su capacidad para ser utilizado como formato de intercambio entre versiones GLSL, utilizando herramientas mantenidas por Khronos Group para compilar GLSL a SPIR-V glslangValidator
, [20] optimizando SPIR-V spirv-opt
, [21] y compilación cruzada a SPIR-V para diferentes objetivos GLSL spirv-cross
. [22]
Sin embargo, como formato, SPIR-V tiene algunas limitaciones notables para la compilación cruzada. Quizás lo más crítico sea el requisito de que cada módulo SPIR-V tenga al menos un símbolo de punto de entrada. Esto evita que el formato se use fácilmente para una compilación separada, donde los sombreadores complejos podrían ensamblarse mediante una serie de pasos de compilación parcial seguidos de un paso de vinculación. La analogía para un lenguaje compilado por CPU es que SPIR-V se puede usar solo para la creación de ejecutables, pero no para archivos de objetos .o
, archivos de objetos compartidos .so
o bibliotecas estáticas .a
. Esto va en contra de los objetivos declarados de algunas herramientas SPIR-V como spirv-link
, [23] que tiene como objetivo proporcionar una funcionalidad de enlace completa para el código binario SPIR-V.
Ver también
- Lenguaje de sombreado de alto nivel (HLSL)
- Cg (lenguaje de programación)
- Lenguaje de sombreado OpenGL (GLSL)
- Infraestructura de sombreado de gráficos de tungsteno
- Computar kernel
- Ejecución de subprocesos paralelos
Referencias
- ^ Farber, Rob (11 de agosto de 2014). "¡OpenCL comercial! SPIR 2.0 protege la propiedad intelectual pero permite kernels libres de código fuente, potentes y portátiles" . TechEnablement . Consultado el 5 de abril de 2015 .
- ^ Trevett, Neil. "Descripción general y actualización de OpenCL" (PDF) .
- ^ "Módulos de sombreado" . Tutorial de Vulkan .
- ^ "HLSL como lenguaje de sombreado Vulkan de primera clase" . El Grupo Khronos . 15 de enero de 2020.
- ^ KhronosGroup / SPIRV-Cross , The Khronos Group, 2019-09-06 , consultado el 2019-09-08
- ^ Especificación del lenguaje de sombreado WebGPU
- ^ Larabel, Michael (12 de septiembre de 2012). "Khronos SPIR para OpenCL trae compatibilidad binaria" . Phoronix . Consultado el 25 de julio de 2015 .
- ^ Smith, Ryan (22 de julio de 2013). "Khronos @ SIGGRAPH 2013: OpenGL 4.4, OpenCL 2.0 y OpenCL 1.2 SPIR Anunciado" . Anandtech . Consultado el 5 de abril de 2015 .
- ^ "Khronos lanza la especificación SPIR 1.2 para codificación portátil de programas de dispositivo OpenCL" . El Grupo Khronos . 2014-01-20 . Consultado el 5 de agosto de 2019 .
- ^ Smith, Ryan (11 de agosto de 2014). "Khronos anuncia OpenCL SPIR 2.0" . Anandtech . Consultado el 5 de abril de 2015 .
- ^ Parkerson, Stuart (4 de marzo de 2015). "Khronos Group presenta la nueva API de controlador de hardware Vulkan y el lenguaje intermedio SPIR-V compartido por Vulkan y OpenCL 2.1" . Revista para desarrolladores de aplicaciones . Consultado el 5 de abril de 2015 .
- ^ "Khronos lanza especificaciones OpenCL 2.1 y SPIR-V 1.0 para programación paralela heterogénea" . www.Khronos.org . 16 de noviembre de 2015 . Consultado el 16 de noviembre de 2015 .
- ^ Kessenich, John. "Introducción a SPIR-V" (PDF) . Khronos . Consultado el 25 de julio de 2015 .
- ^ "SPIRV-LLVM-Translator: una herramienta y una biblioteca para la traducción bidireccional entre SPIR-V y LLVM IR" . GitHub . El Grupo Khronos.
- ^ Trevett, Neil (18 de abril de 2016). "OpenCL A State of the Union (IWOCL 2016)" (PDF) . Grupo Khronos .
- ^ Trevett, Neil (16 de mayo de 2017). "OpenCL State of the Nation (IWOCL 2017)" (PDF) . IWOCL .
- ^ "SPIR - El lenguaje intermedio estándar abierto de la industria para cómputo y gráficos paralelos" . El Grupo Khronos . 2014-01-20 . Consultado el 5 de agosto de 2019 .
- ^ "Registro Khronos SPIR-V - The Khronos Group Inc" . www.khronos.org . Consultado el 5 de agosto de 2019 .
- ^ "Registro Khronos SPIR-V - The Khronos Group Inc" . www.khronos.org . Consultado el 30 de enero de 2020 .
- ^ "Compilador de referencia OpenGL / OpenGL ES" . www.khronos.org . Consultado el 1 de octubre de 2020 .
- ^ "Herramientas SPIR-V" . www.github.com . Consultado el 1 de octubre de 2020 .
- ^ "Cruz SPIR-V" . www.github.com . Consultado el 1 de octubre de 2020 .
- ^ "Herramientas SPIR-V" . www.github.com . Consultado el 1 de octubre de 2020 .
enlaces externos
- Página web de Khronos SPIR
- Especificación provisional de SPIR-V