web-dev-qa-db-fra.com

OpenGL vs OpenCL, lequel choisir et pourquoi?

Quelles sont les fonctionnalités qui rendent OpenCL unique en son genre pour opter pour OpenGL avec GLSL pour les calculs? En dépit de la terminologie liée aux graphiques et des types de données non pratiques, y at-il un réel inconvénient à OpenGL?

Par exemple, l’évaluation de fonctions parallèles peut être réalisée en convertissant une texture en d’autres textures. Les opérations de réduction peuvent être effectuées par un rendu itératif en textures de plus en plus petites. En revanche, l’accès en écriture aléatoire n’est pas possible de manière efficace (la seule façon de procéder est de rendre les triangles à l’aide de données de sommet gérées par la texture). Est-ce possible avec OpenCL? Quoi d'autre n'est pas possible avec OpenGL?

70
dronus

OpenCL est créé spécifiquement pour l'informatique. Lorsque vous effectuez un calcul scientifique 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étriques comme des triangles, etc.) afin d’améliorer vos calculs.

Dans OpenCL, vous venez de formuler votre calcul avec un noyau de calcul sur une mémoire tampon et vous êtes prêt à partir. C’est en fait une grosse victoire (en disant cela du point de vue de la réflexion et de la mise en œuvre des deux variantes).

Les schémas d'accès à la mémoire restent les mêmes (votre calcul est toujours effectué sur un GPU - mais les GPU deviennent de plus en plus flexibles).

Mais qu'attendez-vous d'autre que d'utiliser plus d'une douzaine de "processeurs" parallèles sans vous casser la tête pour savoir comment traduire - par exemple. (exemple stupide) Fourier à Triangles et Quads ...?

56
cli_hlt

Quelque chose qui n'a été mentionné dans aucune réponse jusqu'à présent a été la rapidité d'exécution. If votre algorithme peut être exprimé en graphiques OpenGL (par exemple, aucune écriture dispersée, aucune mémoire locale, aucun groupe de travail, etc.), il s'exécutera très souvent plus rapidement qu'un équivalent OpenCL. Mon expérience spécifique en la matière a consisté à filtrer (regrouper) les noyaux sur les GPU AMD, nVidia, IMG et Qualcomm. Les implémentations OpenGL sont invariablement plus rapides, même après l’optimisation du noyau OpenCL. (à part cela: je suppose que cela est dû à des années de matériel et de pilotes spécialement adaptés aux charges de travail orientées graphiques.)

Mon conseil serait que si votre programme de calcul semble comme si il correspond bien au domaine graphique, utilisez OpenGL. Sinon, OpenCL est plus général et plus simple à exprimer les problèmes de calcul.

Un autre point à mentionner (ou à demander) est de savoir si vous écrivez en tant qu'amateur (c'est-à-dire pour vous-même) ou commercialement (c'est-à-dire pour le distribuer à d'autres). Alors que OpenGL est supporté un peu partout, OpenCL manque totalement de support sur les appareils mobiles et, à mon humble avis, il est très peu probable qu’il apparaisse sur Android ou iOS dans les prochaines années. Si la compatibilité entre plates-formes est large une base de code unique est un objectif, alors OpenGL peut vous être imposé.

41
user2746401

Quelles sont les caractéristiques qui rendent OpenCL unique en son genre pour opter pour OpenGL avec GLSL pour les calculs? Malgré la terminologie liée aux graphiques et les types de données non pratiques, y at-il un réel inconvénient à OpenGL?

Oui: c'est une API graphique. Par conséquent, tout ce que vous faites doit être formulé selon ces termes. Vous devez conditionner vos données sous forme de "rendu". Vous devez comprendre comment gérer vos données en termes d'attributs, de tampons uniformes et de textures.

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

Même dans ce cas, les calculeurs ne modifient pas un fait: les opérations de calcul OpenCL fonctionnent à une précision très différente de celle des calculeurs d’OpenGL. Les exigences de GLSL en matière de précision de virgule flottante ne sont pas très strictes et celles d'OpenGL ES sont encore moins strictes. Ainsi, 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.

En outre, les shaders de calcul OpenGL nécessitent un matériel compatible 4.x, alors qu'OpenCL peut s'exécuter sur un matériel bien plus médiocre.

De plus, si vous effectuez des calculs en cooptant le pipeline de rendu, les pilotes OpenGL continueront de supposer que vous effectuez le rendu. Donc, il va prendre des décisions d'optimisation basées sur cette hypothèse. Cela optimisera l’attribution des ressources de shader en supposant que vous dessiniez une image.

Par exemple, si vous effectuez un rendu sur un framebuffer à virgule flottante, le pilote peut décider de vous attribuer 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 inférieure. Si vous utilisez chargement/stockage d’image au lieu d’un framebuffer, vous aurez beaucoup moins de chances d’obtenir cet effet.

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

En outre, OpenCL vous donne simplement accès à plus de choses. Il vous donne accès aux niveaux de mémoire implicites par rapport à GL. Certaines mémoires peuvent être partagées entre les threads, mais des instances de shader distinctes dans GL ne peuvent pas affecter directement les unes des autres (en dehors de Image Load/Store, mais OpenCL s'exécute sur un matériel sans accès). pour que).

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 vous ne voulez pas ; pas tant qu'il existe une alternative parfaitement viable. Compute in OpenGL permet de desservir le pipeline graphique.

La raison uniquement pour choisir OpenGL pour tout type d'opération de calcul sans rendu est de prendre en charge le matériel qui ne peut pas exécuter OpenCL. À l'heure actuelle, cela comprend beaucoup de matériel mobile.

22
Nicol Bolas

Une caractéristique notable serait les écritures éparpillées, une autre l’absence de "smartness Windows 7". Comme vous le savez probablement, Windows 7 tuera le pilote d’affichage si OpenGL ne se vide pas pendant 2 secondes environ (ne me bloquez pas à l’heure exacte, mais je pense qu’il s’agit de 2 secondes). Cela peut être gênant si vous avez une longue opération.

En outre, OpenCL fonctionne évidemment avec une variété de matériels bien plus grande que la carte graphique et ne dispose pas d’un pipeline rigide orienté graphique avec des "contraintes artificielles". Il est également plus facile (trivial) d’exécuter plusieurs flux de commandes simultanés.

12
Damon

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

Il pourrait être pratique pour OpenGL de fusionner éventuellement en tant qu’extension d’OpenCL. Les deux plates-formes sont à peu près identiques à 80%, mais ont des décalages de syntaxe différents, une nomenclature différente pour à peu près 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 du pilote. ;)

Une autre chose à considérer est que les origines d'OpenGL et d'OpenCL sont différentes: OpenGL a commencé et a pris de l'ampleur au tout début du réseau à réseau fixe et a été lentement ajouté et désapprouvé à mesure que la technologie évoluait. OpenCL, à certains égards, est une évolution de OpenGL dans le sens où OpenGL a commencé à être utilisé pour le traitement numérique alors que la flexibilité (non planifiée) des GPU le permettait. "Graphics vs. Computing" est vraiment un argument sémantique. Dans les deux cas, vous essayez toujours de mapper vos opérations mathématiques sur du matériel avec les performances les plus élevées possibles. Certaines parties du matériel du processeur graphique ne seront pas utilisées par Vanilla CL, mais ne garderont pas une extension distincte.

Alors, comment OpenGL pourrait-il fonctionner sous CL? Spécifiquement, les rasteriseurs triangulaires pourraient être mis en file d'attente en tant que tâche CL spéciale. Des fonctions GLSL spéciales pourraient être implémentées dans Vanilla OpenCL, puis remplacées par des instructions avec accélération matérielle par le pilote lors de la compilation du noyau. Écrire un shader dans OpenCL, en attendant que les extensions de la bibliothèque aient été fournies, ne semble pas du tout être une expérience douloureuse.

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

9
user515655

Une autre raison majeure est que OpenGL\GLSL n'est pris en charge que sur les cartes graphiques. Bien que l'utilisation multicœur 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 avec OpenGL\GLSL vous empêchera d’utiliser tout matériel autre que la carte graphique.

6
Tal Darom

Pour ce qui est d’OpenGL 4.5, il s’agit là des fonctionnalités que OpenGL 4.5 ne possède pas (pour autant que je sache) et qui ne couvrent pas les fonctionnalités qu’OpenGL possède, mais pas OpenCL:

Événements

Meilleure Atomique

Des blocs

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

Mettre le noyau en file d'attente à partir du noyau

Pointeurs (bien que si vous exécutez sur le GPU, cela n'a probablement aucune importance)

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

Mémoire virtuelle partagée

Options du compilateur pour les noyaux

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

Peut fonctionner sur le processeur sans GPU

Plus de soutien 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 (ni 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 via les options du compilateur).

Une grande partie de ce qui précède est principalement destinée à une meilleure interaction processeur-GPU: événements, mémoire virtuelle partagée, pointeurs (bien que ceux-ci puissent éventuellement bénéficier à d’autres projets).

OpenGL a acquis la capacité de trier les choses dans différents domaines de la mémoire du client et du serveur depuis que beaucoup d'autres articles ont été publiés. OpenGL offre maintenant une meilleure prise en charge de la barrière de mémoire et d'Atomics et vous permet d'allouer des éléments à différents registres du GPU (à peu près au même degré qu'OpenCL peut). Par exemple, vous pouvez maintenant partager des registres du groupe de calcul local dans OpenGL (en utilisant quelque chose comme le partage de données local LDS des GPU AMD (bien que cette fonctionnalité particulière ne fonctionne actuellement qu'avec les shaders de calcul OpenGL). Certaines plates-formes (telles que les pilotes Open Source Linux). OpenGL a accès à davantage de matériel à fonction fixe (comme d’autres réponses l'ont déjà dit). S'il est vrai que le matériel à fonction fixe peut parfois être évité (par exemple, Crytek utilise une implémentation "logicielle" d'un profondeur de mémoire tampon) le matériel à fonction fixe peut très bien gérer la mémoire (et généralement bien mieux que quelqu'un qui ne travaille pas pour une entreprise de matériel GPU) et est tout simplement supérieur dans la plupart des cas. Je dois admettre que OpenCL a une très bonne texture à fonction fixe support qui est l’un des principaux domaines de fonctions fixes OpenGL.

Je dirais que Intels Knights Corner est un GPU x86 qui se contrôle tout seul. Je dirais également que OpenCL 2.0 avec ses fonctions de texture (qui sont en réalité des versions moins importantes d’OpenCL) peut être utilisé à peu près au même degré de performance suggéré par l'utilisateur2746401.

4
afree100

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 utiliser des tâches générées par d’autres composants du système. Plus besoin de notions de CPU, de GPU (etc.) - vous avez juste Host & Device (s).

OpenGL, en revanche, a une division stricte en CPU, qui est producteur de tâches et GPU, qui est consommateur de tâches. Ce n'est pas mauvais, car moins de flexibilité garantit de meilleures performances. OpenGL est juste un instrument plus étroit.

3
Roman Arzumanyan

La "fonctionnalité" qu'OpenCL est conçue pour le calcul général, alors qu'OpenGL est pour les graphiques. Vous pouvez faire n'importe quoi dans GL (c'est Turing-complete) mais vous enfoncez un clou en utilisant le manche du tournevis comme un marteau.

En outre, OpenCL peut fonctionner non seulement sur les GPU, mais également sur les processeurs et divers accélérateurs dédiés.

2
Basil Marte

En plus des réponses existantes, OpenCL/CUDA s’adapte non seulement davantage au domaine informatique, mais n’abstrait pas trop le matériel sous-jacent. De cette façon, vous pouvez profiter plus directement de la mémoire partagée ou de l’accès à la mémoire coalescente, qui serait autrement noyé dans l’implémentation réelle du shader (qui n’est rien de plus qu’un noyau spécial OpenCL/CUDA, si vous le souhaitez).

Bien que pour tirer profit de telles choses, vous devez également être un peu plus conscients du matériel spécifique sur lequel votre noyau fonctionnera, mais n'essayez pas de prendre explicitement ces choses en compte à l'aide d'un shader (si cela est tout à fait possible).

Une fois que vous aurez fait 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.

2
Christian Rau