SPIR-V
# SPIR-V

La Representación Intermedia Portable Estándar (en inglés Standard Portable Intermediate Representation, SPIR) es un lenguaje intermedio de computación paralela y gráficos perteneciente al Grupo Khronos, originalmente desarrollado para su uso con OpenCL. La versión actual, SPIR-V, se anunció en marzo de 2015.

## Propósito

OpenCL utiliza compilación instantánea (just-in-time, JIT), usando uno de los dos posibles métodos de distribución de software: los desarrolladores pueden distribuir binarios precompilados dependientes del dispositivo, o bien pueden distribuir el código fuente relevante, limitado por el deseo de proteger la propiedad intelectual. SPIR permite la creación y distribución de binarios independientes del dispositivo en el marco de la pila tecnológica de OpenCL.

## Versiones

SPIR se introdujo en el año 2011, la versión actual SPIR-V se introdujo en el año 2015.

* SPIR 1.2 derivaba del LLVM IR versión 3.2; como extensión OpenCL 1.2
* SPIR 2.0 se derivó del LLVM IR versión 3.4; como extensión OpenCL 2.0
* SPIR-V no derivado de LLVM IR; parte básica de OpenCL 2.1 y de Vulkan

### Versiones basadas en LLVM

Antes del lanzamiento de SPIR-V en el 2015, SPIR estuvo basado en la representación intermedia de LLVM (LLVM IR). Una especificación provisional para SPIR 1.0 se anunció en el 2012. La versión 1.2 se anunció en la conferencia SIGGRAPH 2013, con la versión 2.0 publicada en la misma conferencia un año más tarde.

### SPIR-V

SPIR-V es una versión reescrita de SPIR anunciada en marzo de 2015, y liberada el 16 de noviembre de 2015. La familia SPIR ahora dispone de una API multiplataforma estándar plenamente definida por Khronos con soporte nativo para las características de los shaders y kernels de cómputo.

Soporte para la ingestión de SPIR-V se ha incorporado en la especificación básica de OpenCL 2.1 y la nueva API Vulkan de gráficos y cómputo.

SPIR-V es un lenguaje intermedio de alto nivel, intercambiado en formato binario. Las funciones se representan mediante un [[grafo de control de flujo]] de bloques básicos, utilizando la forma asignación estática única (SSA). Las estructuras de datos retienen la representación jerárquica de alto nivel. SPIR-V no es una representación con pérdidas a diferencia de otros bytecode previos o representaciones intermedias usadas para gráficos y parecidas a máquinas virtuales. Esto permite más rendimiento al traducir SPIR-V al código máquina de los dispositivos donde se ejecute.

