Au cours des 15 dernières années, l’évolution de l’informatique GPU – et maintenant plus largement, diverses formes d’informatique hautement parallèle – a pris une tournure intéressante. Alors que les GPU devenant de plus en plus utilisés comme accélérateurs à usage général étaient largement prédits et ont atteint la cible de manière considérable, la façon dont nous sommes arrivés ici a été un chemin intéressant. La progression du processeur a bredouillé, des architectures parallèles et des entreprises entières ont augmenté et diminué, les supercalculateurs les plus puissants du monde incluent désormais les GPU au cœur de leur débit de calcul, et personne n’a vu la révolution du deep learning arriver jusqu’à ce qu’elle soit déjà sur nous.

Debout dans ce paysage pendant la majeure partie de la dernière décennie et demie, OpenCL, le cadre ouvert de Khronos pour la programmation des GPU et autres accélérateurs de calcul. Née à l’origine par Apple et largement adoptée par l’industrie dans son ensemble, OpenCL a été le premier (et toujours le plus cohérent) effort pour créer une API commune pour la programmation parallèle. En tirant les leçons des premiers efforts propriétaires des constructeurs et en assemblant une norme plus large que tout le monde pourrait utiliser, OpenCL a été adopté pour tout, des processeurs et DSP intégrés aux GPU qui augmentent la consommation d’énergie d’un demi-kilowatt.

Dans l’ensemble, OpenCL a largement réussi à atteindre les objectifs du cadre pour une plate-forme de programmation informatique commune (et largement portable). Il n’est pas seulement pris en charge sur une large gamme de matériel, mais il est incroyablement pertinent même pour les événements actuels: c’est l’API accélérateur utilisée par le projet Folding @ Home, le cluster informatique le plus puissant du monde, qui est intensivement utilisé pour rechercher des options de traitement pour la pandémie de COVID-19.

Dans le même temps, cependant, tout comme la façon dont personne ne pouvait prédire l’évolution du marché de l’informatique parallèle, les choses ne se sont pas toujours déroulées comme prévu pour Khronos et le groupe de travail OpenCL qui est le fer de lance de son développement. Comme nous l’avons évoqué à plusieurs reprises au cours de la dernière année dans divers articles, OpenCL est dans un état précaire sur le bureau du PC, sa maison d’origine. Plus d’une décennie après sa création, l’écosystème informatique du GPU se fracture: l’intérêt de NVIDIA est tempéré par le fait qu’ils ont déjà leur API CUDA très réussie, les pilotes OpenCL d’AMD sont un gâchis, Apple a déconseillé OpenCL et se dirige vers son propre métal propriétaire API. Le seul fournisseur qui semble avoir un réel intérêt pour OpenCL en ce moment est étrangement assez Intel. Pendant ce temps, OpenCL n’a jamais été adopté de manière extravagante dans les appareils mobiles, malgré le fait que ceux-ci obtiennent des GPU de plus en plus puissants et d’autres blocs de traitement parallèles.

En conséquence, Khronos fait aujourd’hui quelque chose pour lequel je ne suis pas sûr qu’il y ait un parallèle dans l’industrie informatique – et certainement, il n’y a jamais rien de semblable dans l’écosystème informatique GPU: le cadre fait un grand pas en arrière. Cherchant à réinitialiser l’écosystème, comme le groupe aime à l’appeler, Khronos dévoile aujourd’hui OpenCL 3.0, la dernière version de son API de calcul. Prenant à cœur certaines leçons durement gagnées (et durement apprises), le groupe remonte le temps sur OpenCL, ramenant l’API de base à une fourchette d’OpenCL 1.2.

En conséquence, tout ce qui a été développé dans le cadre d’OpenCL 2.x est devenu facultatif: les fournisseurs peuvent (et généralement continueront) de prendre en charge ces fonctionnalités, mais ces fonctionnalités ne sont plus nécessaires pour se conformer aux spécifications de base. Au lieu d’avoir à prendre en charge chaque fonctionnalité OpenCL, quelle que soit son utilité ou son utilité pour une plate-forme donnée, l’avenir de l’API dépendra des fournisseurs qui choisiront les fonctionnalités facultatives qu’ils souhaitent prendre en charge par-dessus le cœur, Spécification dérivée d’OpenCL 1.2.

Politique et coups de langue

Dans l’ensemble, l’annonce d’OpenCL 3.0 apporte beaucoup à déballer. Mais peut-être que le meilleur endroit pour commencer est de comprendre le processus de développement d’OpenCL et qui sont les utilisateurs d’OpenCL. Pour rappel, Khronos est un consortium industriel. L’organisation elle-même n’a aucun pouvoir réel – c’est juste une collection d’entreprises – et parce qu’elle n’est pas titulaire d’une plateforme comme Microsoft ou Apple, le groupe ne peut imposer de changement technologique à personne. Au lieu de cela, la force des efforts de Khronos est qu’il obtient un large soutien de l’industrie pour ses normes, intégrant l’expérience et les préoccupations de nombreux fournisseurs à travers l’écosystème.

Cependant, le défi d’une approche collaborative est qu’elle requiert au moins un certain degré d’harmonie et d’accord entre les entreprises participantes. Si aucun accord ne peut être trouvé sur la suite des choses, un projet ne peut pas avancer. Ou si personne n’est satisfait du produit résultant, alors un produit peut être entièrement ignoré. L’établissement de normes industrielles est en fin de compte une question politique, même s’il s’agit d’une norme technologique.

C’est en quelque sorte le problème rencontré par OpenCL. La version la plus récente de la spécification, OpenCL 2.2, a été publiée en 2017. De manière critique, elle a introduit le langage du noyau OpenCL C ++, apportant enfin la prise en charge d’un langage plus moderne et orienté objet à une API qui était à l’origine basée sur C. Equally critique cependant, trois ans plus tard personne n’a adopté OpenCL 2.2. Ni NVIIDA, ni AMD, ni Intel, et certainement aucun fabricant d’appareils embarqués.

Pour un pas en avant aussi important qu’OpenCL 2.2 (et 2.1 avant), le fait est que personne n’a fini par être particulièrement satisfait de l’état d’OpenCL après 1.2 et 2.0. En conséquence, il perd de sa pertinence et ne remplit plus les objectifs du projet. Le projet OpenCL a essayé de plaire à tout le monde avec 2.x, et à la place il n’a fini par plaire à personne.

OpenCL 3.0: aller de l’avant en arrière

Donc, si OpenCL 2.x a été largement ignoré, quelle est la solution pour rendre OpenCL pertinent à nouveau? Pour Khronos et le groupe de travail OpenCL, la réponse est de revenir à ce qui a fonctionné. Et ce qui a le mieux fonctionné était OpenCL 1.2.

Présentée pour la première fois en 2011, OpenCL 1.2 était la dernière des versions d’OpenCL 1.x. Selon les normes API modernes, il est très simple: il est basé sur du C pur et ne prend pas en charge des éléments tels que la mémoire virtuelle partagée ou le langage de représentation intermédiaire SPIR-V. Mais en même temps, c’est aussi la dernière version de l’API qui n’inclut pas un tas de cruches que quelqu’un, quelque part, ne veut pas. Il s’agit d’une API de calcul parallèle pure et assez bas niveau pour les développeurs à travers le spectre, des appareils intégrés aux GPU les plus puissants.

En fin de compte, ce que le groupe de travail OpenCL a pu convenir, c’est qu’OpenCL 1.2 devrait être au cœur d’une nouvelle spécification – que toute autre chose publiée après, quelle que soit l’utilité dans certains cas, ne l’est pas assez pour qu’elle soit requis dans toutes les implémentations. Et donc pour OpenCL 3.0, c’est exactement ce qui se passe. La dernière version d’OpenCL hérite de 1.2 et en fait la nouvelle spécification de base, tandis que toutes les autres fonctionnalités au-delà de celle-ci sont retirées de la spécification de base et sont rendues facultatives.

C’est cette réinitialisation que Khronos et le groupe de travail ont l’intention de donner à OpenCL une nouvelle voie à suivre. Malgré un retour en arrière de près de neuf ans, OpenCL est loin d’être terminé. Mais sa nature rigide et monolithique précédente l’empêchait également d’évoluer, car il n’y avait qu’une seule voie à suivre. Si un fournisseur était satisfait d’OpenCL 1.2 mais souhaitait quelques fonctionnalités 2.1 supplémentaires, par exemple, pour être conforme à la spécification, il aurait besoin d’implémenter l’intégralité de la spécification 2.1 principale; OpenCL 1.x / 2.x n’avait aucun mécanisme de conformité partielle. C’était tout ou rien, et un certain nombre de fournisseurs ont choisi «rien».

OpenCL 3.0, en revanche, est spécifiquement structuré de manière à permettre aux fournisseurs d’utiliser les pièces dont ils ont besoin, et uniquement ces pièces. Comme mentionné précédemment, le cœur de la spécification est essentiellement OpenCL 1.2, avec la prise en charge des requêtes de fonctionnalités supplémentaires, ainsi que certains «points d’entrée mineurs pour une meilleure portabilité des applications». En plus de cela, se trouve tout le reste: toutes les fonctionnalités d’OpenCL 2.x, ainsi que les nouvelles fonctionnalités d’OpenCL 3.0. Toutes ces fonctionnalités supplémentaires sont facultatives, permettant aux fournisseurs de plates-formes de choisir les fonctionnalités supplémentaires qu’ils souhaitent prendre en charge, le cas échéant.

Par exemple, un fournisseur intégré peut rester très proche de ce qui était OpenCL 1.2, puis adopter quelques fonctionnalités comme les extensions DMA asynchrones et la mémoire virtuelle partagée. Pendant ce temps, un grand développeur GPU discret vert peut adopter la plupart d’OpenCL 2.x, mais exclure la prise en charge de cette mémoire virtuelle partagée, ce qui n’est pas très utile pour un accélérateur discret. Et puis un troisième fournisseur au milieu pourrait vouloir adopter lors de la répartition des appareils, mais pas SPIR-V. En fin de compte, OpenCL 3.0 donne aux fournisseurs de plates-formes la possibilité de sélectionner les fonctionnalités dont ils ont besoin, adaptant essentiellement OpenCL à leurs désirs spécifiques.

Il s’avère que cela est très similaire à la façon dont Khronos a abordé Vulkan, qui a connu beaucoup plus de succès ces dernières années. Donner aux fournisseurs une certaine flexibilité dans ce que leurs API implémentent a permis à Vulkan d’être étendu des appareils mobiles au bureau, donc il y a des preuves très claires et réelles que cette structure peut fonctionner. Et c’est ce genre de succès que le groupe de travail OpenCL aimerait voir également.

En fin de compte, comme Khronos le voit, les difficultés d’OpenCL au cours de la dernière demi-décennie sont venues d’essayer de tout faire pour tout le monde tout en gardant sa nature monolithique. Ce dont les gars embarqués ont besoin est différent des gars CPU / APU, et ce dont ces gars ont besoin est toujours différent des gars dGPU – et nous n’avons toujours pas abordé des choses comme les FPGA et les utilisations plus ésotériques d’OpenCL. Ainsi, afin de garantir son propre avenir, OpenCL doit cesser d’être une conception monolithique, et être à la place adaptable à la large gamme d’appareils et de marchés que le cadre est conçu pour servir.

Avancer sur la voie

Plonger un peu plus profondément, examinons rapidement ce que OpenCL 3.0 signifie pour les développeurs, les fournisseurs de plates-formes et les utilisateurs en ce qui concerne le développement et la compatibilité des logiciels.

Malgré le changement significatif dans la philosophie de développement, OpenCL 3.0 est conçu pour être aussi rétrocompatible qu’il est raisonnable. Pour les développeurs et les utilisateurs, car la spécification principale est basée sur OpenCL 1.2, les applications 1.2 s’exécuteront sans changement sur n’importe quel périphérique OpenCL 3.0. Pendant ce temps, pour les applications OpenCL 2.x, ces applications fonctionneront également sans changement sur les périphériques OpenCL 3.0, aussi longtemps que ces périphériques prennent en charge les fonctionnalités 2.x utilisées. Ce qui, bien sûr, ne signifie pas que vous allez bientôt exécuter une application OpenCL 2.1 sur un système embarqué; mais sur les PC et autres systèmes où les applications OpenCL 2.1 fonctionnent déjà, ils ne devraient pas s’arrêter sous OpenCL 3.0.

La raison de cette distinction revient encore à l’inclusion facultative de fonctionnalités. Les fournisseurs de plates-formes développant un runtime OpenCL 3.0 n’ont pas besoin de prendre en charge les fonctionnalités 2.x, mais ils n’ont pas non plus besoin de les supprimer; ils peuvent (continuer à) prendre en charge les fonctionnalités optionnelles comme ils l’entendent. En fait, la nouvelle spécification requiert relativement peu de détenteurs de plate-forme en ce qui concerne la conformité de base. Les pilotes OpenCL 1.2 et 2.x nécessitent des modifications pour respecter la conformité 3.x, mais cela concerne principalement la prise en charge des nouvelles requêtes de fonctionnalités d’OpenCL. Ainsi, les fournisseurs pourront publier des pilotes 3.0 en peu de temps.

À l’avenir, l’accent sera mis sur les développeurs d’applications faisant bon usage des requêtes de fonctionnalités. Étant donné que les fonctionnalités OpenCL 2.x sont facultatives, toutes les applications utilisant les fonctionnalités optionnelles 2.x / 3.0 sont fortement encouragées à utiliser les requêtes de fonctionnalités pour s’assurer d’abord que les fonctionnalités nécessaires sont disponibles; au minimum, une application peut alors échouer sans problème, plutôt qu’un échec plus difficile à invoquer une fonctionnalité qui n’existe pas. Ainsi, alors que le logiciel OpenCL 2.x continuera de fonctionner tel quel, les développeurs sont encouragés à mettre à jour leurs applications pour exécuter des requêtes de fonctionnalités.

Maintenant que tout cela est dit, il convient de noter que, comme un ensemble de fonctionnalités OpenCL 2.x précédemment requises ont été rendues facultatives, cela signifie que les fournisseurs de plates-formes sont autorisés à les supprimer s’ils le souhaitent. En parlant à Khronos, cela ne sonne pas comme si cela allait se produire – du moins, pas avec les fournisseurs de matériel informatique – mais c’est une option néanmoins, et une option qu’ils reconnaissent. L’endroit le plus susceptible d’être vu (le cas échéant) serait l’espace intégré, etc., où les fournisseurs traînaient déjà les talons sur des fonctionnalités telles que SPIR-V.

Enfin, bien que l’impact réel de cela soit nul, il convient également de noter que, car OpenCL 2.2 n’a jamais été adopté, la norme OpenCL 3.0 laisse techniquement quelque chose derrière. OpenCL C ++, qui a été introduit en 2.2, n’a pas été inclus dans la spécification OpenCL 3.0, même en tant que fonctionnalité facultative. Au lieu de cela, le groupe de travail OpenCL le rejette entièrement.

Le remplacement d’OpenCL C ++ est le projet C ++ pour OpenCL qui, malgré les similitudes de dénomination, est un projet entièrement distinct. Les différences sont assez faibles du point de vue de la programmation, mais essentiellement C ++ pour OpenCL est en cours de construction avec une approche en couches. Dans ce cas, utiliser Clang / LLVM pour compiler le code jusqu’à SPIR-V, qui peut ensuite être exécuté aux niveaux inférieurs de la pile d’exécution OpenCL comme un autre code. Et bien sûr, le SYCL de Khronos reste également disponible pour fournir une programmation C ++ à source unique pour le calcul parallèle. Il convient de noter que SYCL est basé sur OpenCL 1.2, ce qui rend cette transition plutôt intacte.

Nouveautés d’OpenCL 3.0: extensions DMA asynchrones et SPIR-V 1.3

Outre la réversion majeure de la spécification de base, OpenCL comprend également de nouvelles fonctionnalités facultatives pour les fournisseurs de plate-forme et les développeurs. Parmi celles-ci, les extensions DMA asynchrones, qui finiront par être une carotte particulièrement savoureuse pour les fournisseurs de plates-formes qui s’en tiennent à OpenCL 1.2 jusqu’à présent.

Destiné à exposer les opérations d’accès direct à la mémoire dans OpenCL pour les appareils dotés d’un matériel DMA, le DMA asynchrone est exactement ce que le nom dit sur l’étain: prise en charge de l’exécution asynchrone des transferts DMA. Cela permet aux transactions DMA d’être exécutées simultanément avec les noyaux de calcul, contrairement aux opérations synchrones qui ne peuvent généralement être exécutées qu’entre d’autres opérations du noyau de calcul. Cela inclut également la possibilité d’exécuter plusieurs opérations DMA simultanément.

Cette fonctionnalité est particulièrement remarquable pour permettre les transferts de mémoire 2D et 3D, c’est-à-dire les structures de mémoire complexes qui sont plus avancées que les structures de mémoire 1D (linéaires) simples. Comme vous pouvez vous y attendre, cela est destiné à être utile pour les images et les données similaires, qui sont intrinsèquement des structures 2D / 3D.

Pendant ce temps, OpenCL 3.0 introduit également la prise en charge SPIR-V 1.3 pour OpenCL. Il s’agit là encore d’une fonctionnalité facultative pour les détenteurs de plate-forme, et apporte OpenCL un peu plus à jour dans son support SPIR-V, avec SPIR-V principal maintenant à la version 1.5. À vrai dire, je ne sais pas dans quelle mesure l’option de prise en charge de 1.3 sera pertinente pour le moment, car elle fait partie de la spécification Vulkan 1.1 – et en fait, beaucoup d’avancées par rapport à 1.2 sont axées sur les graphiques – cela va jouer un rôle plus important à l’avenir dans le renforcement de l’interopérabilité entre Vulkan et OpenCL.

Quelle est la prochaine étape pour OpenCL?

Enfin, dans le cadre de la refonte majeure d’OpenCL pour 3.0, Khronos et le groupe de travail OpenCL présentent également leurs plans pour le développement futur d’OpenCL. En effaçant la carte et en déplaçant tant de fonctionnalités en option, cela donne au groupe de travail une nouvelle liberté d’ajouter à OpenCL comme la base d’utilisateurs le juge opportun. Et, suivant leur nouvelle philosophie, de manière plus parcellaire.

Une grande partie, comme toujours, sera l’évolution continue de la spécification de base OpenCL. Alors que la version 3.0 renverse les choses, le plan n’est pas de maintenir la spécification de base 1.2-eque pour toujours. Au contraire, comme d’autres projets Khronos, l’objectif du groupe de travail est toujours de déplacer des extensions largement adoptées et bien testées dans le noyau. Pour ajouter à nouveau des couches supplémentaires à l’oignon, pour ainsi dire, mais de manière beaucoup plus intelligente et mesurée que le développement OpenCL 2.x.

En attendant, l’une des fonctionnalités hautement prioritaires pour les futures versions sera ce que le groupe appelle Flexible Profile, qui est une autre fonctionnalité intégrée. Fait intéressant, à certains égards, il s’agit d’une version encore plus allégée d’OpenCL, permettant aux fournisseurs d’accise encore plus de fonctionnalités pour correspondre spécifiquement à ce que leur matériel peut faire. Par exemple, les modes de précision à virgule flottante comme la simple précision IEEE, qui sont normalement requis dans OpenCL 1.2 / 3.0, pourraient être supprimés, ainsi que certains appels d’API. En plus de simplifier davantage les choses pour certains développeurs, cela rendrait OpenCL mieux adapté aux environnements avec des exigences de certification de sécurité rigoureuses (pensez à l’automobile), car un ensemble de fonctionnalités OpenCL plus petit serait beaucoup plus facile à valider et à obtenir la certification.

Pendant ce temps, à l’autre bout du spectre, Khronos examine à nouveau l’idée des ensembles de fonctionnalités pour OpenCL, pour aider les développeurs de logiciels à mieux naviguer dans les différences entre les principales plates-formes. Alors que la nature riche en options d’OpenCL 3.0 le rend relativement fin, il nuit également à la portabilité dans une certaine mesure – un développeur ne peut pas compter sur une autre implémentation d’OpenCL 3.0 pour avoir nécessairement plus que ce que la spécification de base 1.2-eqsue exige . Donc, contrairement aux jeux de fonctionnalités graphiques pour les GPU, les jeux de fonctionnalités OpenCL permettraient à l’industrie de s’engager dans une certaine normalisation – par exemple, un profil PC avec de nombreuses fonctionnalités modernes, puis un profil d’apprentissage automatique avec prise en charge d’un plus petit nombre de fonctionnalités plus pertinentes pour les profondeurs opérations d’apprentissage.

Le groupe examine également des opportunités continues d’approches en couches, où le support OpenCL n’est pas (et ne sera probablement jamais) une partie native de la plate-forme. Il s’agit d’un autre concept emprunté au livre de jeu Vulkan, où il existe des couches disponibles pour exécuter Vulkan sur des plates-formes comme Apple’s Metal. OpenCL a déjà un projet actif à exécuter au-dessus de Vulkan – clspv et clvk – qui a été utilisé dans les mobiles pour aider Adobe à porter et à réutiliser son code OpenCL de deskto0p Premiere vers Premiere Rush sans nécessiter une réécriture approfondie. Pendant ce temps, Microsoft a également soutenu un projet OpenCL, (Open) CLOn12, qui implémentera la prise en charge d’OpenCL 1.2 en plus de DirectX 12.

Mais la grande question de la superposition que pose Khronos tourne actuellement autour d’OpenCL pour les plates-formes d’Apple. L’auteur original d’OpenCL ne l’a pas fait plus loin que la prise en charge d’OpenCL 1.2, et il a marqué la fonctionnalité comme obsolète. Donc, si OpenCL va continuer à fonctionner sur les plates-formes Apple – sans parler de la prise en charge des nouvelles fonctionnalités 2.x et 3.x – alors une nouvelle prise en charge devra être ajoutée en tant que couche de niveau supérieur. Donc, bien qu’il n’y ait pas actuellement de projet OpenCL sur Metal, il semble que ce ne soit qu’une question de temps avant que l’on ne démarre, si bien sûr Khronos peut trouver suffisamment de parties intéressées pour le projet. Le groupe a connu beaucoup de succès avec MoltenVK, leur couche Vulkan-over-Metal, donc un projet OpenCL cadrerait bien avec cela.

Enfin, même Vulkan lui-même est en quelque sorte un projet potentiel pour le groupe de travail OpenCL. Les inversions de la spécification de base signifient que l’interopérabilité Vulkan / OpenCL a pris du recul, et le groupe de travail aimerait aller de l’avant. Idéalement, OpenCL devrait pouvoir fonctionner dans le même ensemble de mémoire que Vulkan, ainsi qu’importer et exporter des sémaphores, le tout de manière explicite.

OpenCL 3.0: Provisoire aujourd’hui, formalisation en quelques mois?

Mais avant que tout cela ne puisse se produire officiellement, Khronos et le groupe de travail OpenCL auront du pain sur la planche pour qu’ils ouvrent OpenCL 3.0. Alors que le groupe présente OpenCL 3.0 aujourd’hui, la norme est encore provisoire – elle est révélée aux développeurs et au grand public pour obtenir des commentaires avant la formalisation complète. Et étant donné l’état de pulvérisation d’OpenCL 2.x, le groupe est impatient de finaliser OpenCL 3.0 plus tôt que tard.

Tout compte fait, Khronos espère pouvoir obtenir la ratification de la norme dans quelques mois. En plus d’obtenir l’adhésion des membres et des développeurs, la finalisation exigera également que les tests de conformité OpenCL 3.0 (qui sont également déjà en développement) soient terminés, afin que le groupe puisse approuver officiellement les implémentations d’OpenCL 3.0. Étant la partie technique, cela peut finir par être la tâche la plus facile; avec la spécification de base OpenCL 3.0 déroulant tant de fonctionnalités et ajoutant si peu en retour, les fournisseurs qui ont déjà des implémentations OpenCL solides ne devraient pas avoir trop de mal à préparer leurs pilotes OpenCL 3.0.