Vulkan® : Le Futur pour les IHM embarquées critiques
Vulkan® est une nouvelle API de rendu et de calculs 3D, publiée par le groupe Khronos en 2016, accompagnée par des outils de développement, de test et des couches de validation ainsi qu'un pilote Linux open-source conforme. Vulkan® est une API haute performance et sans redevance offrant un accès multi-plateformes aux GPU modernes. Conçue spécialement pour les applications graphiques temps réel 3D, Vulkan® convient à un large éventail de plates-formes allant des téléphones mobiles aux systèmes embarqués. Architecturée sur des composants de l’API Mantle d’AMD, Vulkan® a été initialement prévue comme le principal successeur de OpenGL®, mais a été entièrement pensée depuis le début pour permettre un accès direct aux GPUs modernes et pour supporter les pratiques de programmation récentes.
Vulkan® vs OpenGL ?
Les API OpenGL et Vulkan® ont chacune leurs avantages, il est donc essentiel d’examiner le cas d’utilisation avant de décider pour l’une ou l’autre. Il est important de noter que même si OpenGL a 25 ans ou plus, elle continuera à être développée car, à certains égards, elle est plus facile à utiliser qu’une API de plus bas niveau telle que Vulkan®. Cependant, les fournisseurs de GPU devraient finalement migrer d’OpenGL vers Vulkan®.
OpenGL n’exige pas des développeurs de s’occuper de la gestion de la mémoire ni de la synchronisation des différents blocs du GPU, la rendant utilisable pour tous les niveaux de programmeurs. OpenGL étant orientée pour des contextes de haut niveau, une grande partie des fonctionnalités sont « cachées » à l’intérieur du driver, permettant une abstraction de toutes les plateformes matérielles. Le développeur dit au driver ce qu'il veut faire, et comment il veut que cela soit réalisé, et le driver s’occupe des détails complexes et des vérifications, y compris de réaliser les appels corrects des APIs et de valider si l’état est valide ou non. Le driver remonte également au développeur les codes erreurs quand il y en a. De plus, chaque commande individuelle dans OpenGL contient plus de fonctionnalités que des APIs de plus bas niveau, et de nombreuses fonctions peuvent être complétées facilement. Cependant, le corollaire de cette facilité d'utilisation est moins de flexibilité et de contrôle dans la gestion du GPU par rapport à une API de plus bas niveau.
Si Vulkan® est plus complexe à utiliser que OpenGL, elle offre beaucoup plus de contrôle sur le GPU et permet de contrôler directement le matériel. Bien que la gestion de la mémoire et la gestion des erreurs doivent être gérées par l’application, cela offre plus de souplesse pour optimiser ces processus, permettant d’avoir des performances beaucoup plus élevées qu’avec OpenGL.
OpenGL n’exige pas des développeurs de s’occuper de la gestion de la mémoire ni de la synchronisation des différents blocs du GPU, la rendant utilisable pour tous les niveaux de programmeurs. OpenGL étant orientée pour des contextes de haut niveau, une grande partie des fonctionnalités sont « cachées » à l’intérieur du driver, permettant une abstraction de toutes les plateformes matérielles. Le développeur dit au driver ce qu'il veut faire, et comment il veut que cela soit réalisé, et le driver s’occupe des détails complexes et des vérifications, y compris de réaliser les appels corrects des APIs et de valider si l’état est valide ou non. Le driver remonte également au développeur les codes erreurs quand il y en a. De plus, chaque commande individuelle dans OpenGL contient plus de fonctionnalités que des APIs de plus bas niveau, et de nombreuses fonctions peuvent être complétées facilement. Cependant, le corollaire de cette facilité d'utilisation est moins de flexibilité et de contrôle dans la gestion du GPU par rapport à une API de plus bas niveau.
Si Vulkan® est plus complexe à utiliser que OpenGL, elle offre beaucoup plus de contrôle sur le GPU et permet de contrôler directement le matériel. Bien que la gestion de la mémoire et la gestion des erreurs doivent être gérées par l’application, cela offre plus de souplesse pour optimiser ces processus, permettant d’avoir des performances beaucoup plus élevées qu’avec OpenGL.
Pourquoi Vulkan® ?
Vulkan® est une API orientée Objets sans état global. Alors que Vulkan® partage les pipelines graphiques d’OpenGL et la nomenclature, d’anciennes couches d’abstraction ont été supprimées. Cela a permis de simplifier les protocoles et de minimiser les « surcouts » des drivers graphiques. Vulkan® est une API moins lourde et plus étendue qu'OpenGL. Bien qu'il existe davantage de fonctions dans Vulkan®, chaque fonction spécifique nécessite moins de charge pour le processeur et génère moins d’overhead. Cette flexibilité donne à l'application la possibilité de configurer exactement la quantité de ressources dont elle a besoin, ce qui permet d'optimiser les activités et de réduire le temps système nécessaire au processeur. La principale différence entre OpenGL et Vulkan® réside dans le fait que l'implémentation OpenGL doit faire des suppositions sur les intentions de l'application - par exemple, elle doit choisir le meilleur segment de mémoire pour une allocation donnée - alors que l'implémentation de Vulkan® est donnée explicitement par l'application.
Les figures 3 et 4 ci-dessous montrent la différence d'utilisation du processeur entre OpenGL et Vulkan®.
Les figures 3 et 4 ci-dessous montrent la différence d'utilisation du processeur entre OpenGL et Vulkan®.
Différence d'utilisation du processeur entre OpenGL et Vulkan®
Vulkan® élimine le besoin d'avoir des APIs de calcul et graphiques distinctes. En effet, Vulkan® permet de recevoir des commandes graphiques ou de calcul, et de les allouer à la bonne unité d’exécution du GPU. Cela est beaucoup plus efficace et moins complexe que l’exécution d’un environnement mixte OpenGL et OpenCL™. Contrairement à OpenGL qui, en raison de son encapsulation de haut niveau, n'était pas une API se prêtant facilement à des environnements multithreads, Vulkan® permet une meilleure mise à l'échelle sur des processeurs multicœurs. Par exemple, dans les CPU multicœurs exécutant OpenGL, un seul cœur est généralement responsable de la gestion des tâches urgentes. Vulkan® peut toutefois exploiter des ressources matérielles précédemment inutilisées pour répartir cette charge de travail entre plusieurs cœurs. Les pilotes Vulkan® ne vérifient pas les erreurs, économisant ainsi un temps d’utilisation considérable du processeur. Toutefois, Vulkan® possède une couche facultative de vérification des paramètres qui peut être utilisée. Néanmoins, si l'application applique une vérification stricte des données, cette couche peut ne pas être requise. La génération de buffers parallèles garantit l'utilisation de tous les cœurs et permet aux développeurs de tirer le meilleur parti des performances de leur matériel.
OpenGL et Vulkan® donnent à l’application l’accès aux pipelines programmables du GPU. OpenGL utilise le langage de shader GLSL tandis que Vulkan® utilise SPIR-V. Les instructions SPIR-V ressemblent aux instructions de montage. De nombreux développeurs d'applications Vulkan® écrivent d'abord leurs shaders en GLSL, puis utilisent un convertisseur GLSL-> SPIR-V hors connexion, avant de fournir le binaire SPIR-V à Vulkan®.
API de sécurité CoreAVI VkCore™ SC
Afin d’amener les capacités et performances de Vulkan® aux marchés des systèmes embarqués critiques, CoreAVI a développé une version sécuritaire de l’API Vulkan® appelée VkCore SC™.
VkCore SC™ a été conçue et développée dès le départ pour offrir de hautes performances et de la flexibilité et de passer avec succès la certification RTCA DO-178C / EUROCAE ED-12C jusqu'au DAL A. Les applications héritées sont également prises en charge par les versions CoreAVI sécuritaires de OpenGL avec OpenGL SC 1.0.1 et OpenGL SC 2.0 appelées VkCoreGL SC 1 et VkCoreGL SC 2 s'exécutant au-dessus de Vulkan® et permettant aux applications OpenGL héritées de tirer parti des fonctionnalités avancées de Vulkan® lors de la transition d'OpenGL vers Vulkan®. Cela permet d’améliorer les performances et d’ajouter des fonctionnalités différenciées aux applications existantes.
VkCore SC™ est disponible avec les packages de certification de sécurité DO-178C / ED-12C requis pour les applications avioniques, ainsi qu'avec un certificat d'évaluation de la sécurité accrédité ISO 26262 pour les plates-formes automobiles.
VkCore SC™ a été conçue et développée dès le départ pour offrir de hautes performances et de la flexibilité et de passer avec succès la certification RTCA DO-178C / EUROCAE ED-12C jusqu'au DAL A. Les applications héritées sont également prises en charge par les versions CoreAVI sécuritaires de OpenGL avec OpenGL SC 1.0.1 et OpenGL SC 2.0 appelées VkCoreGL SC 1 et VkCoreGL SC 2 s'exécutant au-dessus de Vulkan® et permettant aux applications OpenGL héritées de tirer parti des fonctionnalités avancées de Vulkan® lors de la transition d'OpenGL vers Vulkan®. Cela permet d’améliorer les performances et d’ajouter des fonctionnalités différenciées aux applications existantes.
VkCore SC™ est disponible avec les packages de certification de sécurité DO-178C / ED-12C requis pour les applications avioniques, ainsi qu'avec un certificat d'évaluation de la sécurité accrédité ISO 26262 pour les plates-formes automobiles.
1 Voir https://www.khronos.org/assets/uploads/developers/library/overview/2015_vulkan_v1_Overview.pdf
2 Voir https://www.toptal.com/api-developers/a-brief-overview-of-vulkan-api (Oct 30, 2017)
3 Voir https://www.youtube.com/watch?v=r0fgEVEgK_k (origine document AMD)
4 Voir https://www.youtube.com/watch?v=r0fgEVEgK_k (origine document AMD)
2 Voir https://www.toptal.com/api-developers/a-brief-overview-of-vulkan-api (Oct 30, 2017)
3 Voir https://www.youtube.com/watch?v=r0fgEVEgK_k (origine document AMD)
4 Voir https://www.youtube.com/watch?v=r0fgEVEgK_k (origine document AMD)