OpenGL vs. OpenCL, à choisir et pourquoi?

Quelles caractéristiques font d’OpenCL unique pour choisir sur OpenGL avec GLSL pour les calculs? En dépit de la terminologie relative aux graphiques et des types de données peu pratiques, y a-t-il une réelle mise en garde concernant OpenGL?

Par exemple, l’évaluation de la fonction parallèle peut être effectuée en rendant une texture à l’aide d’autres textures. Les opérations de réduction peuvent être effectuées en rendant de manière itérative des textures de plus en plus petites. D’un autre côté, l’access en écriture aléatoire n’est pas possible de manière efficace (le seul moyen de le faire est de rendre les sortingangles par données de sumt pilotées par une texture). Est-ce possible avec OpenCL? Qu’est-ce qui n’est pas possible avec OpenGL?

OpenCL est créé spécifiquement pour l’informatique. Lorsque vous effectuez des calculs scientifiques en utilisant OpenGL, vous devez toujours réfléchir à la manière de mapper votre problème informatique au contexte graphique (par exemple, parler en termes de textures et de primitives géomésortingques telles que les sortingangles, etc.).

Dans OpenCL, il vous suffit de formuler votre calcul avec un kernel de calcul sur un tampon de mémoire et vous êtes prêt à partir. Il s’agit en fait d’une grande victoire (affirmant qu’elle a réfléchi et mis en œuvre les deux variantes).

Les modèles d’access à la mémoire sont les mêmes (votre calcul est toujours en cours sur un GPU, mais les GPU sont de plus en plus flexibles de nos jours).

Mais qu’espérez-vous d’autre que d’utiliser plus d’une douzaine de “processeurs” parallèles sans vous soucier de la traduction, par exemple (exemple stupide) de Fourier en Triangles et Quads …?

Quelque chose qui n’a pas encore été mentionné dans les réponses a été la rapidité d’exécution. Si votre algorithme peut être exprimé dans des graphiques OpenGL (par exemple, pas d’écritures dispersées, pas de mémoire locale, pas de groupe de travail, etc.), il s’exécutera très souvent plus rapidement qu’un équivalent OpenCL. Mon expérience spécifique de ce travail a été de créer des kernelx de filtres d’image (regrouper) sur les GPU AMD, nVidia, IMG et Qualcomm. Les implémentations OpenGL s’exécutent invariablement plus rapidement même après une optimisation du kernel OpenCL. (à part: je soupçonne que cela est dû au fait que des années de matériel et de pilotes ont été spécifiquement adaptées aux charges de travail orientées graphiques).

Mon conseil serait que si votre programme de calcul ressemble à celui du domaine graphique, utilisez OpenGL. Sinon, OpenCL est plus général et plus simple pour exprimer des problèmes de calcul.

Un autre point à mentionner (ou à demander) est de savoir si vous écrivez en tant qu’amateur (c.-à-d. Pour vous-même) ou commercialement (par exemple pour le dissortingbuer à d’autres). Alors qu’OpenGL est supporté à peu près partout, OpenCL manque totalement de support sur les appareils mobiles et, à mon avis, il est peu probable qu’il apparaisse sur Android ou iOS dans les prochaines années. Si l’objective de la compatibilité multi-plateforme à partir d’une base de code unique est atteint, OpenGL peut vous être imposé.

Quelles caractéristiques font d’OpenCL unique pour choisir sur OpenGL avec GLSL pour les calculs? En dépit de la terminologie relative aux graphiques et des types de données peu pratiques, y a-t-il une réelle mise en garde concernant OpenGL?

Oui, c’est une API graphique. Par conséquent, tout ce que vous faites doit être formulé en ce sens. Vous devez emballer vos données sous forme de “rendu”. Vous devez déterminer comment gérer vos données en termes d’atsortingbuts, de tampons uniformes et de textures.

Avec OpenGL 4.3 et OpenGL ES 3.1, les choses deviennent un peu plus confuses. Un shader de calcul peut accéder à la mémoire via SSBO / Image Load / Store de la même manière que pour les opérations de calcul OpenCL (bien que OpenCL offre des pointeurs réels, contrairement à GLSL). Leur interopérabilité avec OpenGL est également beaucoup plus rapide qu’avec OpenCL / GL interop.

Malgré tout, les shaders de calcul ne changent pas un fait: les opérations de calcul OpenCL opèrent avec une précision très différente de celle des shaders de calcul OpenGL. Les exigences de précision en virgule flottante de GLSL ne sont pas très ssortingctes, et celles d’OpenGL ES sont encore moins ssortingctes. Donc, si la précision en virgule flottante est importante pour vos calculs, OpenGL ne sera pas le moyen le plus efficace de calculer ce que vous devez calculer.

De plus, les shaders de calcul OpenGL requièrent du matériel compatible avec 4.x, tandis que OpenCL peut fonctionner sur du matériel beaucoup plus médiocre.

En outre, si vous effectuez un calcul en cooptant le pipeline de rendu, les pilotes OpenGL continueront de supposer que vous effectuez le rendu. Il va donc y avoir des décisions d’optimisation basées sur cette hypothèse. Il optimisera l’affectation des ressources de shader en supposant que vous dessinez une image.

Par exemple, si vous effectuez un rendu à un framebuffer à virgule flottante, le pilote peut décider de vous donner un framebuffer R11_G11_B10, car il détecte que vous ne faites rien avec l’alpha et que votre algorithme peut tolérer une précision moindre. Si vous utilisez un chargement / stockage d’image au lieu d’un tampon d’image, vous risquez fort peu d’obtenir cet effet.

OpenCL n’est pas une API graphique; c’est une API de calcul.

En outre, OpenCL vous donne juste access à plus de choses. Il vous donne access aux niveaux de mémoire implicites vis-à-vis de GL. Une certaine mémoire peut être partagée entre les threads, mais les instances de shader distinctes dans GL ne peuvent pas affecter directement les unes les autres (en dehors d’Image Load / Store, mais OpenCL s’exécute sur un matériel qui n’y a pas access).

OpenGL cache ce que le matériel fait derrière une abstraction. OpenCL vous expose à presque exactement ce qui se passe.

Vous pouvez utiliser OpenGL pour effectuer des calculs arbitraires. Mais tu ne veux pas; pas tant qu’il existe une alternative parfaitement viable. Calculer dans OpenGL permet de gérer le pipeline graphique.

La seule raison de choisir OpenGL pour toute opération de calcul non liée au rendu est de prendre en charge le matériel qui ne peut pas exécuter OpenCL. À l’heure actuelle, cela inclut beaucoup de matériel mobile.

Une caractéristique notable serait des écritures éparses, une autre serait l’absence de “Windows 7 smartness”. Windows 7 va, comme vous le savez probablement, tuer le pilote d’affichage si OpenGL ne videra pas pendant environ 2 secondes (ne me limitez pas l’heure exacte, mais je pense qu’il est de 2 secondes). Cela peut être gênant si vous avez une longue opération.

De plus, OpenCL fonctionne évidemment avec une plus grande variété de matériel que la simple carte graphique, et il n’a pas de pipeline rigide orienté graphique avec des “contraintes artificielles”. Il est plus facile (sortingvial) d’exécuter plusieurs stream de commandes simultanés.

Bien qu’OpenGL soit actuellement le meilleur choix pour les graphiques, ce n’est pas permanent.

Il pourrait être pratique pour OpenGL de fusionner en tant qu’extension d’OpenCL. Les deux plates-formes sont à peu près égales à 80%, mais ont des particularités de syntaxe différentes, une nomenclature différente pour les mêmes composants du matériel. Cela signifie deux langues à apprendre, deux API à comprendre. Les développeurs de pilotes graphiques préféreraient une fusion car ils n’auraient plus à développer pour deux plates-formes distinctes. Cela laisse plus de temps et de ressources pour le débogage des pilotes. 😉

Une autre chose à prendre en compte est que les origines d’OpenGL et d’OpenCL sont différentes: OpenGL a commencé et pris de l’ampleur au cours des premiers jours du réseau fixe par réseau et a été lentement ajouté et déconseillé au fur et à mesure de l’évolution de la technologie. OpenCL, à certains égards, est une évolution d’ OpenGL dans le sens où OpenGL a commencé à être utilisé pour le traitement numérique en tant que flexibilité (non planifiée) des GPU autorisés. “Graphics vs. Computing” est plutôt un argument sémantique. Dans les deux cas, vous essayez toujours de mapper vos opérations mathématiques sur le matériel avec les meilleures performances possibles. Il y a des parties du matériel GPU que vanilla CL n’utilisera pas mais cela ne conservera pas une extension séparée.

Alors, comment OpenGL pourrait-il fonctionner sous CL? Spécifiquement, les rasteriseurs de sortingangle pourraient être mis en queue en tant que tâche CL spéciale. Des fonctions spéciales de GLSL pourraient être implémentées dans OpenCL de vanilla, puis remplacées par des instructions accélérées par le pilote lors de la compilation du kernel. L’écriture d’un shader dans OpenCL, en attendant que les extensions de la bibliothèque aient été fournies, ne semble pas être une expérience douloureuse.

Appeler l’un pour avoir plus de fonctionnalités que les autres n’a pas beaucoup de sens, car ils gagnent tous deux 80% des mêmes caractéristiques, juste sous une nomenclature différente. Affirmer que OpenCL n’est pas bon pour les graphiques car il est conçu pour l’informatique n’a aucun sens car le traitement graphique est informatique.

Une autre raison majeure est que OpenGL \ GLSL est uniquement pris en charge sur les cartes graphiques. Bien que l’utilisation de plusieurs cœurs ait commencé avec l’utilisation de matériel graphique, de nombreux fournisseurs de matériel travaillent sur une plate-forme matérielle multicœur ciblée pour le calcul. Par exemple, voir Intels Knights Corner.

Développer du code pour le calcul en utilisant OpenGL \ GLSL vous empêchera d’utiliser du matériel autre qu’une carte graphique.

Eh bien, à partir d’OpenGL 4.5, ce sont les fonctionnalités que OpenCL 2.0 a OpenGL 4.5 (pour autant que je sache) (cela ne couvre pas les fonctionnalités qu’OpenCL ne possède pas d’OpenCL):

Événements

Mieux atomique

Blocs

Fonctions de groupe de travail: work_group_all et work_group_any work_group_broadcast: work_group_reduce work_group_inclusive / exclusive_scan

Enqueue Kernel from Kernel

Pointeurs (mais si vous exécutez sur le GPU, cela n’a probablement pas d’importance)

Quelques fonctions mathématiques que OpenGL n’a pas (bien que vous puissiez les construire vous-même dans OpenGL)

Mémoire virtuelle partagée

(Plus) Options du compilateur pour les kernelx

Facile à sélectionner un GPU particulier (ou autre)

Peut fonctionner sur le processeur quand aucun GPU

Plus de support pour ces plates-formes matérielles de niche (par exemple, FGPA)

Sur certaines (toutes?) Plates-formes, vous n’avez pas besoin d’une fenêtre (et de sa liaison de contexte) pour effectuer des calculs.

OpenCL permet un peu plus de contrôle sur la précision des calculs (y compris à travers les options du compilateur).

Beaucoup de ce qui précède sont principalement pour une meilleure interaction processeur-GPU: événements, mémoire virtuelle partagée, pointeurs (bien que ceux-ci puissent également être utiles).

OpenGL a été en mesure de sortinger les choses dans différentes zones de la mémoire du client et du serveur, car de nombreux autres articles ont été créés ici. OpenGL a maintenant une meilleure barrière de mémoire et un support atomique et vous permet d’allouer des choses à différents registres du GPU (à peu près au même degré que OpenCL). Par exemple, vous pouvez partager des registres dans le groupe de calcul local maintenant dans OpenGL (en utilisant quelque chose comme le LDS (partage de données local) AMD GPUs (bien que cette fonctionnalité ne fonctionne qu’avec les éditeurs de calcul OpenGL à ce moment). certaines plates-formes (telles que les pilotes Open Source Linux) .OpenGL a access à davantage de matériel à fonction fixe (comme d’autres réponses) Bien qu’il soit vrai que des fonctions fixes peuvent parfois être évitées (par exemple, Crytek utilise une implémentation logicielle de buffer de profondeur) le matériel de fonction fixe peut gérer la mémoire très bien (et généralement bien mieux que quelqu’un qui ne travaille pas pour une entreprise de matériel GPU) et est largement supérieur dans la plupart des cas. support qui est l’une des principales zones de fonctions fixes OpenGL.

Je dirais que Intels Knights Corner est un GPU x86 qui se contrôle lui-même. Je soutiendrais également que OpenCL 2.0 avec ses fonctions de texture (qui sont en fait dans des versions inférieures d’OpenCL) peut être utilisé à peu près au même degré de performance suggéré par user2746401.

OpenCL (version 2.0) décrit un environnement informatique hétérogène, dans lequel chaque composant du système peut à la fois produire et consumr des tâches générées par d’autres composants du système. Plus besoin de notions de CPU, de GPU (etc), vous n’avez plus besoin que de Host & Device (s).

OpenGL, à l’opposé, a une division ssortingcte entre CPU, qui est le producteur de tâches et le GPU, qui est le consommateur de tâches. Ce n’est pas mal, car moins de flexibilité assure une meilleure performance. OpenGL est juste un instrument plus étroit.

Outre les réponses déjà existantes, OpenCL / CUDA ne s’adapte pas seulement au domaine informatique, mais ne résout pas trop le matériel sous-jacent. De cette façon, vous pouvez tirer profit de choses comme la mémoire partagée ou l’access à la mémoire coalescée plus directement, qui serait autrement enterré dans l’implémentation du shader (qui n’est rien de plus qu’un kernel OpenCL / CUDA spécial).

Bien que pour tirer profit de ces choses, vous devez également être un peu plus conscient du matériel spécifique sur lequel votre kernel sera exécuté, mais n’essayez pas de prendre explicitement en compte ces éléments en utilisant un shader (si même complètement possible).

Une fois que vous faites quelque chose de plus complexe que les simples routines BLAS de niveau 1, vous apprécierez sûrement la flexibilité et la généricité d’OpenCL / CUDA.

La “fonctionnalité” que OpenCL est conçue pour le calcul à usage général, alors que OpenGL est pour les graphiques. Vous pouvez faire n’importe quoi en GL (c’est Turing-complet) mais vous conduisez alors un clou en utilisant la poignée du tournevis comme un marteau.

De plus, OpenCL peut fonctionner non seulement sur les GPU, mais également sur les processeurs et différents accélérateurs dédiés.