OpenCL, qu'est-ce que cette API pour CPU et GPU?

OpenCL

Le calcul scientifique a connu une amélioration avec l'utilisation de GPU et d'API comme OpenCL. Précisément de ce qu'est cette API, nous allons vous parler dans cet article, afin que vous connaissiez les différences avec les autres API « graphiques », dans quels domaines cette API est utilisée et quelle est sa situation actuelle.

Tout d'abord, il faut préciser qu'OpenCL n'est pas un type de matériel, mais plutôt un logiciel ou plutôt une API qui sert à communiquer les applications avec le GPU en utilisant une abstraction au niveau logiciel du GPU lui-même. Sa différence avec le reste des APIs que les applications communiquent avec le GPU est que ce n'est pas ce que l'on peut dire une API graphique, mais une API pour le calcul scientifique.

GPU pour l'informatiqueNVIDIA Tesla OpenCL

Qu'est-ce que le GPU Computing ? Gardez à l'esprit que les GPU peuvent exécuter des programmes appelés shaders, qui sont utilisés pour manipuler les caractéristiques des différentes primitives dans le pipeline 3D, quelle que soit leur forme. Évidemment, tout processeur ne voit qu'une série de données en binaire, donc lorsqu'une unité de shader exécute un programme de shader, elle traite un ensemble de données et peut donc être utilisée pour traiter n'importe quel type de données.

Au milieu des années 2000, avec l'arrivée des GPU aux shaders unifiés, la possibilité de les utiliser sur des marchés au-delà de celui du jeu sur PC est apparue, le principal étant celui de l'informatique scientifique, qui a permis le départ du NVIDIA Gamme Tesla à partir de 2007.

La différence entre ces GPU et ceux utilisés pour les jeux réside dans leur capacité à fonctionner en virgule flottante double précision, ce qui n'est pas nécessaire dans les jeux, mais dans le monde de la science sous tous ses aspects. Soit pour des calculs astronomiques, soit pour produire un médicament de nouvelle génération.

OpenCL, une API pour le calcul GPU

Éléments de traitement OpenCL

Jusqu'à l'apparition d'OpenCL, les API graphiques étaient conçues uniquement pour le rendu de graphiques, mais pas à des fins informatiques, elles n'étaient donc pas entièrement efficaces pour exécuter des algorithmes non graphiques sur un GPU. La solution? Évidemment, le développement d'une API pour l'informatique, qu'ils ont appelée OpenCL où CL provient de Compute Library.

Mais en quoi OpenCL et les autres API sont-ils différents? Nous pouvons exécuter OpenCL sur n'importe quel type de processeur, non seulement sur les GPU, mais si nous voulons que nous puissions exécuter du code OpenCL, c'est un Processeur si nous en avons besoin, à part cela, nous pouvons également l'exécuter sur des DSP, des FPGA, des réseaux de neurones et un long etc.

La raison en est que leur modèle est basé sur le calcul distribué où nous avons une unité hôte qui est le CPU et une série d'unités de traitement qui peuvent être des GPU, DSP, FPGA, etc. Vers lesquelles les tâches à exécuter sont envoyées. Chaque tâche étant un élément de traitement, qui lors de son traitement le résultat est envoyé à l'hôte et / ou une confirmation qu'il a réalisé ladite tâche. Chaque élément de traitement est un programme séparé, donc un thread avec son propre compteur de programme.

OpenCL n'est pas une API graphique

GPU Virtualización

Il faut préciser qu'OpenCL ne contrôle pas le pipeline graphique et qu'il n'est donc pas utilisé pour exécuter des graphes, puisqu'une bonne partie des fonctions d'OpenGL et d'autres API telles que Direct3D, Vulkan, etc. Ils ne se trouvent pas dans OpenCL. De plus, OpenCL a été conçu à l'origine pour s'interfacer avec OpenGL et est actuellement conçu pour fonctionner avec Vulkan, l'API graphique actuelle du groupe Khronos.

Une autre différence concerne le langage de programmation utilisé pour exécuter les programmes Shader. Dans le cas des API graphiques, des langages de shader de haut niveau sont utilisés, tels que GLSL dans le cas d'OpenGL et Vulkan, HLSL dans le cas de DirectX, etc.

En revanche, avec OpenCL ce n'est pas le cas, des langages généraux et non spécifiques tels que C et C++ sont utilisés, ce qui permet de porter des programmes et algorithmes écrits dans ces langages vers OpenCL afin qu'ils puissent être exécuté sur tous les types d'appareils prenant en charge cette API. et pouvoir profiter de sa plus grande polyvalence que les langages limités pour les shaders.

Comment OpenCL est-il appliqué dans les applications quotidiennes?

édition vidéo numérique

OpenCL est largement utilisé dans certaines applications PC, en particulier dans les applications multimédias. Lorsque, par exemple, dans Photoshop nous disons au programme d'exécuter un filtre d'image aujourd'hui, cela se fait via OpenCL et l'algorithme fonctionne sur le matériel le plus approprié qui prend en charge l'API, donc si nous avons le composant le plus approprié, la partie OpenCL fonctionnera dessus.

D'autres types d'applications quotidiennes qui utilisent OpenCL sont les codecs vidéo tels que AV1, HEVC, H.264, etc. La plupart d'entre eux sont programmés en OpenCL pour les mêmes raisons que nous avons évoquées précédemment. Cela permet au processeur de les exécuter et les développeurs n'ont pas à se casser la gueule s'il y a un codec vidéo dans le matériel et à l'optimiser.

Fait intéressant, OpenCL est aussi la raison pour laquelle la partie 2D basée sur VGA a disparu des cartes graphiques, et c'est que même si cela semble contradictoire, il est bien mieux de faire fonctionner l'interface graphique 2D d'un système d'exploitation via le calcul via GPU.

DirectX Computing et le boycott de NVIDIA avec CUDA

Calcul DirectX

OpenCL est en déclin en termes d'utilisation, surtout après que DirectX 11 a inclus Compute Shaders dans son répertoire et Apple a également inclus son API Metal. L'apparition d'API graphiques avec un support partiel pour l'informatique est ce qui a fait perdre de l'importance à OpenCL.

C'est à partir de l'introduction des Compute Shaders que l'abandon d'OpenCL a commencé à être progressif. La dernière version largement utilisée est la 1.2 de la norme. C'est une version très rudimentaire par rapport à ce que d'autres API peuvent faire, car elle ne prend pas en charge des choses comme la mémoire virtuelle partagée, SPIR-V pour une meilleure interaction avec Vulkan.

OpenCL CUDA

Mais CUDA est le principal ennemi d'OpenCL. La raison en est que NVIDIA a dominé le monde des GPU hautes performances pendant des années et qu'ils en ont profité pour faire fonctionner une grande partie du calcul scientifique autour de CUDA et non sous OpenCL, car cela lie les programmes à leur matériel. NVIDIA a pu le faire en raison d'un manque total de concurrence envers sa NVIDIA Tesla,

Comment boycotter OpenCL de NVIDIA ? Ne prend pas officiellement en charge les améliorations d'OpenCL 2.0, qui étaient également dans CUDA. Non seulement cela, mais NVIDIA n'a jamais pris en charge OpenCL sur ses GPU NVIDIA Tesla, Quadro ou GeForce.

La troisième fois chanceux?

OpenCL UOU

Au final, afin d'éviter l'effondrement définitif d'OpenCL pour sa troisième version, ils ont dû repenser l'ensemble de l'API dans sa troisième version. Dans la version, une bonne partie des éléments qui faisaient partie de la branche principale d'OpenCL 2.x ont été rétrogradés vers des extensions optionnelles et le matériel de base n'a donc pas besoin de les supporter à nouveau. Il est donc désormais possible d'exécuter OpenCL 3.0 sur du matériel doté de pilotes OpenCL 1.2 et d'ajouter les extensions que nous souhaitons utiliser nous-mêmes, un moyen de contourner la censure de NVIDIA.

Dans tout le problème auquel OpenCL est confronté, c'est qu'en dehors du monde de l'informatique scientifique, il est le plus utilisé dans les jeux vidéo. Surtout lors du calcul de la physique des jeux vidéo, ainsi que de la détection de collision. Le fait que Compute Shaders existe à la fois dans Vulkan et DirectX relègue l'utilisation d'OpenCL au calcul scientifique, qui est actuellement le domaine absolu de CUDA.

Un marché que l'API aurait pu atteindre et réussir est Raspberry Picomme les périphériques embarqués, mais la version 2.0 les a écartés car elle se concentrait trop sur le calcul scientifique. La version 3.0 n'a pas pour but d'amener OpenCL vers des systèmes embarqués qui l'adopteraient sans problèmes pour une multitude d'applications, mais cherche plutôt à gagner une guerre déjà perdue d'avance et qu'au sein même du groupe Khronos il y a déjà concurrence à OpenCL sous la forme de Vulkan.