Standard Portable Intermediate Representation - Standard Portable Intermediate Representation

SPIR
SPIR logo.svg
Entwickler Khronos Group
Erstveröffentlichung Januar 2014  ( 2014-01 )
Stabile Version
SPIR-V 1.5 / 13. September 2019 ; Vor 19 Monaten  ( 2019-09-13 )
Betriebssystem Plattformübergreifend
Plattform Plattformübergreifend
Art Zwischensprache
Webseite www .khronos .org / spir

Standard Portable Intermediate Representation ( SPIR ) ist eine Zwischensprache für paralleles Rechnen und Grafiken der Khronos Group , die ursprünglich für die Verwendung mit OpenCL entwickelt wurde . SPIR wurde im März 2015 in SPIR-V umgeschrieben.

Zweck

OpenCL verwendet die Just-in-Time-Kompilierung (JIT), für die eines von zwei Softwareverteilungsmustern erforderlich ist : Entwickler können gerätespezifische vorkompilierte Binärdateien verteilen oder relevanten Quellcode verteilen , der durch den Wunsch nach Schutz des geistigen Eigentums eingeschränkt ist . SPIR ermöglicht die Erstellung und Verteilung von geräteunabhängigen Binärdateien innerhalb des OpenCL-Stacks. Die Offline-Art der Kompilierung ermöglicht auch flexiblere Sprachverbesserungen wie die Verwendung neuerer C ++ - Funktionen.

Noch wichtiger ist, dass mit SPIR-V die Vulkan-API jede beliebige Schattierungssprache verwenden kann , einschließlich GLSL und HLSL . SPIR-V kann mit SPIRV-Cross in mehrere Schattierungssprachen ( GLSL , GLSL ES, MSL , HLSL ) kompiliert werden, so dass diese Sprachen untereinander konvertiert werden können. Die Textschattierungssprache von WebGPU ist als dünne Schicht über SPIR-V konzipiert.

Versionen

SPIR wurde ursprünglich im Jahr 2011 und SPIR-V im Jahr 2015 eingeführt.

SPIR und SPIR-V
SPIR 1.2 SPIR 2.0 SPIR-V 1.X.
LLVM-Interaktion LLVM IR Version 3.2 LLVM IR Version 3.4 100% Khronos definiert

Verlustfreie Hin- und Rückfahrt

Konstrukte berechnen Metadaten / Intrinsics Metadaten / Intrinsics Einheimisch
Grafikkonstrukte Nein Nein Einheimisch
Unterstützte Sprache und unterstützte Funktionen OpenCL C 1.2 OpenCL C 1.2

OpenCL C 2.0

OpenCL C 1.2 / 2.X.

OpenCL C ++

GLSL

OpenCL-Aufnahme OpenCL 1.2-Erweiterung OpenCL 2.0-Erweiterung OpenCL 2.1 / 2.2 Core
Grafik-API-Aufnahme N / A N / A Vulkan 1.X.

OpenGL 4.6 Core

LLVM-basierte Versionen

SPIR vor der Veröffentlichung von SPIR-V 2015 basierte auf der LLVM Intermediate Representation . Eine vorläufige Spezifikation für SPIR 1.0 wurde 2012 angekündigt. Am 22. Juli 2013 wurde auf der SIGGRAPH 2013 eine vorläufige Spezifikation SPIR 1.2 angekündigt . Die endgültige SPIR 1.2-Spezifikation wurde am 21. Januar 2014 auf der HiPEAC 2014 veröffentlicht. Am 11. August 2014 wurde auf der SIGGRAPH 2014 eine vorläufige Spezifikation für SPIR 2.0 veröffentlicht .

SPIR-V

SPIR-V 1.0 ist eine überarbeitete Version von SPIR, die im März 2015 angekündigt und am 16. November 2015 veröffentlicht wurde. Die SPIR-Familie enthält jetzt einen echten API-übergreifenden Standard, der von Khronos vollständig definiert wird und native Shader- und Kernel-Funktionen unterstützt.

SPIR-V ist eine Hochsprache für Fortgeschrittene, die in binärer Form ausgetauscht wird. Funktionen werden durch ein Kontrollflussdiagramm von Basisblöcken unter Verwendung des SSA-Formulars ( Static Single Assignment ) dargestellt. Datenstrukturen behalten ihre hierarchische Darstellung auf hoher Ebene bei. Es ist nicht verlustbehaftet wie früherer Bytecode oder virtuelle Maschinendarstellungen, die für grafische Shader verwendet werden. Dies ermöglicht eine nahezu optimale Leistung auf den Zielgeräten. Ein separates Programm der Khronos Group ermöglicht die gegenseitige Konvertierung mit LLVM IR.

Die Unterstützung für die Aufnahme von SPIR-V ist in der Kernspezifikation von OpenCL 2.1, der Vulkan-API und OpenGL Version 4.6 enthalten.

SPIR-V 1.1

Am 18. April 2016 wurde SPIR-V 1.1 zusammen mit Provisional OpenCL 2.2 auf der IWOCL 2016 veröffentlicht . SPIR-V 1.1 fügte Unterstützung für OpenCL C ++, Ausführungsmodi für Initialisierungs- / Finalisierungsfunktionen, benannte Barrieren, Ausführung von Untergruppen, Programmbereichspipes und Pipe-Speicher hinzu.

SPIR-V 1.2

Am 16. Mai 2017 wurde SPIR-V 1.2 zusammen mit OpenCL 2.2 auf der IWOCL 2017 veröffentlicht . SPIR-V 1.2 hat die Unterstützung für die Laufzeitspezialisierung der wichtigsten Optimierungsparameter in OpenCL 2.2 hinzugefügt.

SPIR-V 1.3

Am 7. März 2018 wurde SPIR-V 1.3 zusammen mit Vulkan 1.1 veröffentlicht . SPIR-V 1.3 Unterstützung für Untergruppenoperationen hinzugefügt und erweiterte Compileroptimierungen ermöglicht.

SPIR-V 1.4

Am 7. Mai 2019 wurde SPIR-V 1.4 veröffentlicht.

SPIR-V 1.5

Am 13. September 2019 wurde SPIR-V 1.5 veröffentlicht.

SPIR-V für GLSL Cross-Compilation

Nachfolgende Versionen der OpenGL Shading Language (GLSL) führten eine Reihe von rückwärts inkompatiblen Sprachänderungen ein. Infolgedessen werden GLSL-Shader, die auf mehrere OpenGL-Versionen abzielen, für jede Version einmal neu geschrieben. Dies wird durch praktische Kompatibilitätsprobleme aufgrund von Implementierungen verschärft, die an eine bestimmte ältere Version von GLSL gebunden sind, z. B. für WebGL 1.0 und die OpenGL-Implementierung von Apple. Einer der bemerkenswerten Anwendungsfälle von SPIR-V ist seine Fähigkeit, als Austauschformat zwischen GLSL-Versionen verwendet zu werden, wobei von der Khronos Group verwaltete Tools zum Kompilieren von GLSL zu SPIR-V glslangValidator , zum Optimieren von SPIR-V spirv-opt und zum Cross-Kompilieren zu SPIR verwendet werden -V zu verschiedenen GLSL-Zielen spirv-cross .

Als Format weist SPIR-V jedoch einige bemerkenswerte Einschränkungen für die Kreuzkompilierung auf. Am kritischsten ist vielleicht die Anforderung, dass jedes SPIR-V-Modul mindestens ein Einstiegspunktsymbol hat. Dies verhindert, dass das Format leicht für eine separate Kompilierung verwendet werden kann, bei der komplexe Shader durch eine Reihe von Teilkompilierungsschritten zusammengesetzt werden können, gefolgt von einem Verknüpfungsschritt. Die Analogie für eine CPU-kompilierte Sprache besteht darin, dass SPIR-V nur zum Erstellen ausführbarer Dateien verwendet werden kann .o , nicht jedoch für Objektdateien , gemeinsam genutzte Objektdateien .so oder statische Bibliotheken .a . Dies steht im Widerspruch zu den erklärten Zielen einiger SPIR-V-Tools wie z. B. spirv-link der Bereitstellung einer vollständigen Verknüpfungsfunktionalität für SPIR-V-Binärcode.

Siehe auch

Verweise

Externe Links