stringtranslate.com

Representación Intermedia Portátil Estándar

Standard Portable Intermediate Representation ( SPIR ) es un lenguaje intermedio para computación paralela y gráficos de Khronos Group . Se utiliza en múltiples entornos de ejecución, incluida la API de gráficos Vulkan y la API de cómputo OpenCL , para representar un sombreador o un núcleo . También se utiliza como lenguaje de intercambio para compilación cruzada. [1] [2]

SPIR-V es una nueva versión de SPIR que fue presentada en 2015 por Khronos Group y desde entonces ha reemplazado al SPIR original, que se presentó en 2012.

El 19 de septiembre de 2024, Microsoft anunció planes para adoptar SPIR-V como formato de intercambio Direct3D en lugar de DXIL, comenzando el soporte a partir de Shader Model 7. [3]

Objetivo

Los objetivos de SPIR-V son representar de forma nativa los primitivos necesarios para el cálculo y los gráficos; separar el lenguaje de alto nivel de la interfaz con los controladores de cálculo y gráficos; ser la forma de distribución o distribuir binarios completamente compilados; ser una especificación completamente autónoma; y admitir múltiples API. También se utiliza como un objetivo intermedio para herramientas de compilación cruzada.

Por ejemplo, SPIR-V permite que la API de Vulkan utilice cualquier lenguaje de sombreado , incluidos GLSL y HLSL . [4] [5] SPIR-V se puede descompilar en varios lenguajes de sombreado ( GLSL , GLSL ES , MSL , HLSL ) utilizando SPIRV-Cross, de modo que estos lenguajes se puedan interconvertir. [6] También tiene rutas hacia y/o desde WebGPU , OpenCL , SYCL , C++ y Rust .


En las plataformas de destino, la ingesta de SPIR-V elimina la necesidad de crear un compilador de código fuente de lenguaje de alto nivel en los controladores de dispositivos, lo que reduce la complejidad del controlador. [2]

Versiones

SPIR se introdujo originalmente en 2011 y SPIR-V se introdujo en 2015.

Versiones basadas en LLVM

SPIR antes del lanzamiento de SPIR-V en 2015 se basaba en la representación intermedia 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 de 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 no utiliza LLVM. [2]

SPIR-V

SPIR-V 1.0 es una nueva versión 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 cruzada completamente definido por Khronos con soporte nativo para funciones de sombreado y kernel.

Un programa independiente del Grupo Khronos permite la interconversión con LLVM IR. [13]

El soporte para la ingestión de SPIR-V está incorporado en la especificación principal de OpenCL 2.1, la API de Vulkan y OpenGL versión 4.6.

Características

SPIR-V es un lenguaje intermedio de alto nivel que se intercambia en forma binaria. Las funciones se representan mediante un gráfico de flujo de control de bloques básicos, utilizando el formato de asignación única estática (SSA). Las estructuras de datos conservan una representación jerárquica de alto nivel. No presenta pérdidas como las representaciones intermedias anteriores de código de bytes o similares a las de máquinas virtuales que se utilizaban para los sombreadores gráficos. Esto permite un rendimiento más cercano al óptimo en los dispositivos de destino. [17]

Extensibilidad

SPIR-V se puede ampliar escribiendo extensiones para añadir semántica o reservando rangos de valores de token para el uso de la otra parte. Los proveedores pueden añadir de forma independiente la semántica deseada a SPIR-V. [18] Se pueden proporcionar conjuntos adicionales de conjuntos de instrucciones extendidas en especificaciones independientes. Se pueden importar varios conjuntos sin problemas, ya que las instrucciones extendidas se utilizan especificando el ID del conjunto y de la instrucción dentro del conjunto. [18]

Sombreadores

Los depuradores incluyen RenderDoc , SwiftShader y Amber. [19]

Los sombreadores gráficos utilizan un flujo de control estructurado en SPIR-V para indicar cómo se anida el flujo de control. Esto ayuda a definir la divergencia y la reconvergencia del flujo de control en entornos de ejecución paralela. [20] La especialización reduce la cantidad de variantes de un sombreador que deben distribuirse. [21]

Validación

La especificación SPIR-V establece las reglas que se deben seguir para tener un módulo SPIR-V válido. Esto permite la validación fuera de línea. Los controladores no están obligados a manejar módulos SPIR-V no válidos. En las pruebas, las pruebas de conformidad verifican que los controladores se comporten correctamente al consumir SPIR-V válido, mientras que los validadores verifican que los front-ends generen SPIR-V correctamente. [22]

Enlace

SPIR-V puede expresar llamadas a funciones en una unidad de compilación diferente. La versión estándar de SPIR-V utiliza esta característica para los núcleos de cómputo OpenCL, pero no para las etapas de sombreado, que las API gráficas quieren que estén completamente vinculadas en un único módulo SPIR-V. [23] Hay extensiones disponibles para permitir que las herramientas utilicen temporalmente sombreadores parcialmente vinculados y también núcleos. [24]

Capacidades

Un módulo SPIR-V es utilizado por una API de cliente para respaldar las características de ese módulo, que se clasifican por capacidades y se declaran al principio del módulo. Un validador puede confirmar que el módulo utiliza solo sus capacidades declaradas, y una API de cliente puede rechazar módulos que declaren capacidades no admitidas. [25]

SPIR-V para compilación cruzada GLSL

SPIR-V se ha utilizado para ayudar a manejar múltiples versiones de lenguajes de nivel fuente. Por ejemplo, las múltiples versiones de OpenGL Shading Language (GLSL) requieren la distribución de múltiples versiones de shaders, debido a las implementaciones que están vinculadas a una versión anterior específica de GLSL, como WebGL 1.0 y la implementación OpenGL de Apple. Uno de los casos de uso notables de SPIR-V es su capacidad de ser utilizado como un formato de intercambio entre versiones GLSL, utilizando herramientas mantenidas por el Grupo Khronos para compilar GLSL a SPIR-V glslangValidator, [26] optimizar SPIR-V spirv-opt, [22] y realizar una compilación cruzada a SPIR-V para diferentes destinos GLSL spirv-cross. [27]

Sin embargo, como formato, SPIR-V tiene algunas limitaciones para la compilación cruzada, incluido 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 la compilación separada, donde los sombreadores complejos podrían ensamblarse mediante una serie de pasos de compilación parcial seguidos de un paso de enlace. Esto va en contra de los objetivos establecidos de algunas herramientas SPIR-V como spirv-link[ 22], que apunta a proporcionar una funcionalidad de enlace completa para el código binario SPIR-V.

Véase también

Referencias

  1. ^ abcd "Registro SPIR-V de Khronos - The Khronos Group Inc". www.khronos.org . Consultado el 16 de enero de 2024 .
  2. ^ abcTerzo , Olivier; Djemame, Karim; Scionti, Alberto; Pezuela, Clara (10 de septiembre de 2019). Arquitecturas informáticas heterogéneas: desafíos y visión. Prensa CRC. ISBN 9780429680038. Recuperado el 24 de junio de 2022 .
  3. ^ Bieneman, Chris (19 de septiembre de 2024). "DirectX adopta SPIR-V como el formato de intercambio del futuro". Blog para desarrolladores de DirectX . Consultado el 19 de septiembre de 2024 .
  4. ^ "Módulos de sombreado". Tutorial de Vulcano .
  5. ^ "HLSL como lenguaje de sombreado de Vulkan de primera clase". The Khronos Group . 15 de enero de 2020.
  6. ^ KhronosGroup/SPIRV-Cross, The Khronos Group, 6 de septiembre de 2019 , consultado el 8 de septiembre de 2019
  7. ^ Larabel, Michael (12 de septiembre de 2012). "Khronos SPIR para OpenCL ofrece compatibilidad binaria". Phoronix . Consultado el 25 de julio de 2015 .
  8. ^ Smith, Ryan (22 de julio de 2013). "Khronos @ SIGGRAPH 2013: OpenGL 4.4, OpenCL 2.0 y OpenCL 1.2 SPIR Announced". Anandtech . Consultado el 5 de abril de 2015 .
  9. ^ "Khronos lanza la especificación SPIR 1.2 para codificación portátil de programas de dispositivos OpenCL". The Khronos Group . 2014-01-20 . Consultado el 2019-08-05 .
  10. ^ Smith, Ryan (11 de agosto de 2014). "Khronos Announces OpenCL SPIR 2.0". Anandtech . Consultado el 5 de abril de 2015 .
  11. ^ 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". App Developer Magazine . Consultado el 5 de abril de 2015 .
  12. ^ "Khronos lanza las 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 .
  13. ^ "SPIRV-LLVM-Translator: una herramienta y una biblioteca para la traducción bidireccional entre SPIR-V y LLVM IR". GitHub . El grupo Khronos.
  14. ^ Trevett, Neil (18 de abril de 2016). "OpenCL: un estado de la Unión (IWOCL 2016)" (PDF) . Khronos Group .
  15. ^ Trevett, Neil (16 de mayo de 2017). "OpenCL State of the Nation (IWOCL 2017)" (PDF) . IWOCL .
  16. ^ "SPIR - El lenguaje intermedio estándar abierto de la industria para computación paralela y gráficos". The Khronos Group . 2014-01-20 . Consultado el 2019-08-05 .
  17. ^ Kessenich, Juan. "Una introducción a SPIR-V" (PDF) . Cronos . Consultado el 25 de julio de 2015 .
  18. ^ ab "Guía SPIRV". github.com . Consultado el 24 de junio de 2022 .
  19. ^ "Google publica en código abierto el marco de prueba de sombreadores multi-API 'Amber'". phoronix.com . Consultado el 24 de junio de 2022 .
  20. ^ "Especificación SPIR-V: flujo de control estructurado". khronos.org . Consultado el 24 de junio de 2022 .
  21. ^ "Constantes de especialización". veldrid.dev . Consultado el 24 de junio de 2022 .
  22. ^ abc "Herramientas SPIR-V". www.github.com . Consultado el 1 de octubre de 2020 .
  23. ^ "Conceptos básicos de los sombreadores". informit.com . Consultado el 24 de junio de 2022 .
  24. ^ "Extensión SPIR-V para Visual Studio". saschawillems.de . Consultado el 24 de junio de 2022 .
  25. ^ "Especificación SPIR-V: capacidades del lenguaje". khronos.org . Consultado el 24 de junio de 2022 .
  26. ^ "Compilador de referencia de OpenGL/OpenGL ES" www.khronos.org . Consultado el 1 de octubre de 2020 .
  27. ^ "SPIR-V Cross". www.github.com . Consultado el 1 de octubre de 2020 .

Enlaces externos