Les API GPU cachaient un problème de compilateur au sein de la portabilité. Si chaque pilote devait analyser du code source de haut niveau, la complexité des pilotes augmentait et chaque langage nécessitait un chemin vers chaque environnement d'exécution. Cela rendait difficile la justification de nouveaux front ends.

La démarche de Khronos en 2015 a consisté à standardiser le niveau intermédiaire. SPIR-V 1.0 a défini un langage intermédiaire binaire compact pour les shaders graphiques et les noyaux de calcul. OpenCL 2.1 en a garanti la consommation, et Vulkan l'a adopté comme entrée de shader.

L'astuce résidait dans la séparation : les front ends produisent du SPIR-V, les pilotes consomment du SPIR-V. Khronos a déclaré que cela réduisait la complexité du compilateur de haut niveau intégré, encourageait la diversité des langages, améliorait la portabilité et permettait à certaines parties de la compilation et de la réflexion de se dérouler hors ligne.

Faire consommer l'IR par le pilote, et non le source

L'IR binaire était entièrement spécifié par Khronos, de sorte que les fournisseurs pouvaient optimiser les back ends sans posséder le langage source.

L'utilisation du même IR dans Vulkan et OpenCL donnait aux créateurs d'outils une cible unique pour le graphisme et le calcul.

La compilation hors ligne réduisait le travail d'exécution des shaders et facilitait la validation, la réflexion et l'outillage.

Des traducteurs, assembleurs et désassembleurs open source ont contribué à amorcer l'écosystème au lancement.

Une forme intermédiaire standard peut transformer un problème de compilateur N par M en deux marchés plus petits : de nombreux front ends et de nombreux back ends optimisés.

SPIR-V est devenu une partie essentielle des chaînes d'outils Vulkan et OpenCL. Sa spécification unifiée couvre désormais toutes les versions depuis 1.0, et Khronos continue de la maintenir comme la couche binaire portable sous-jacente à plusieurs API graphiques et de calcul.

VÉRIFIEZ LES SOURCES

Les sources

  1. Khronos Releases OpenCL 2.1 and SPIR-V 1.0 Specifications for Heterogeneous Parallel Programming Khronos Group · khronos.org ·
  2. SPIR-V Specification Khronos Group · registry.khronos.org