# SPIR-V

SPIR/SPIR-V (Standard Portable Intermediate Representation) è un linguaggio open-source intermedio per la computazione parallela e per la grafica, sviluppato dal Khronos Group, per un utilizzo con i linguaggi OpenCL, Vulkan e OpenGL. OpenCL utilizza la compilazione just-in-time (JIT), che necessita di due modelli di distribuzione del software: gli sviluppatori possono distribuire binari pre-compilati specifici per il device/periferica su cui gireranno (GPU/FPGA) o possono distribuire il codice sorgente, che può essere limitato dalla necessità di proteggere la proprietà intellettuale del software. SPIR permette la creazione e la distribuzione di binari indipendenti dal device, all’interno dello stack OpenCL.

## Versioni

SPIR è stato introdotto originariamente nel 2011, mentre la versione corrente, SPIR-V, è stata presentata nel 2015.
* SPIR 1.2 (Maggio 2013), basato su LLVM IR versione 3.2; è parte delle estensioni per OpenCL 1.2.
* SPIR 2.0 (Giugno 2014), basato su LLVM IR versione 3.4; è parte delle estensioni per OpenCL 2.0.
* SPIR-V 1.0 (Novembre 2015) non è più basato su LLVM IR; è parte integrante di OpenCL 2.1 come di Vulkan e OpenGL.
* SPIR-V 1.1 (Aprile 2016), migliorato il supporto a Python, introdotto il supporto a OpenCL 2.2 e risolti molti bug.
* SPIR-V 1.2 (Maggio 2017), introdotto il supporto a HLSL, migliorato il supporto a OpenCL 2.2.
* SPIR-V 1.3 (Marzo 2018), viene integrato il pieno supporto a Vulkan 1.1 ed è un consistente passo in avanti nell'unione tra Vulkan e OpenCl
* SPIR-V 1.4 (Maggio 2019), risolti molti bug, introdotta una migliore gestione della memoria e altre funzionalità.
* SPIR-V 1.5 Revision 3 (Aprile 2020)
* SPIR-V 1.6 (Dicembre 2021), supporto ai sorgenti di C++ per OpenCl, uso di ascidoctor e molte altre estensioni.

## Spir-V

Le versioni precedenti alla Spir-V erano basate su LLVM. La prima specifica provvisoria per SPIR 1.0 è stata annunciata nel 2012, mentre la versione stabile 1.2 è stata annunciata al SIGGRAPH 2013, con la versione 2.0 presente alla stessa conferenza l’anno successivo. SPIR è poi evoluto in uno standard aperto definito dal KronosGroup, realmente cross-API: SPIR-V è nativamente incorporato nelle specifiche di OpenCL 2.1 e 2.2 (mentre SPIR ne era una estensione esterna), nelle specifiche di Vulkan e anche nelle specifiche della versione 4.6 di OpenGL. SPIR-V supera molte limitazioni del modello LLVM, supportando anche i kernel OpenCL C e OpenCL C++, con tutte le possibilità legate a questi due linguaggi standard.

## Hardware e Linguaggi supportati

Pur essendo nato in coppia con OpenCL, SPIR-V è stato pensato per supportare il più vasto campo possibile dei linguaggi di programmazione, come Python, Vulkan, C#, Rust, LINQ e molti altri. A livello hardware SPIR-V è supportato da tutti i maggiori vendor che supportano OpenCL (come AMD, Intel, Xilinx, Nvidia e altri) ed è in grado di funzionare anche su dispositivi mobile attraverso il layer per Android.

## Funzionalità

SPIR-V rappresenta una grossa novità sia dal lato dei vendor hardware sia dal lato dei programmatori: i primi possono evitare la necessità di costruire un compilatore di alto livello del linguaggio sorgente all’interno dei driver delle periferiche, riducendone in maniera significativa la complessità e permettendo l’utilizzo di una vasta gamma di linguaggi e di framework front-end su diverse architetture hardware. Per gli sviluppatori, utilizzare SPIR-V significa che il codice sorgente del kernel non deve più essere esposto direttamente, che i tempi di caricamento del kernel possono essere accelerati e che essi possono scegliere l'utilizzo di una lingua di front-end comune, migliorando l'affidabilità del kernel e la portabilità in più configurazioni hardware.
Con il progetto di unificazione dei linguaggi Vulkan e OpenCL, SPIR-V diventerà ancor più fondamentale per gestire insieme la programmazione sia di effetti grafici che di applicativi GPGPU.