88 votes

OpenGL vs. OpenCL, lequel choisir et pourquoi ?

Quelles sont les caractéristiques qui font qu'il faut choisir OpenCL plutôt qu'OpenGL avec GLSL pour les calculs ? Malgré la terminologie liée au graphisme et les types de données peu pratiques, y a-t-il un réel problème avec OpenGL ?

Par exemple, l'évaluation parallèle des fonctions peut être effectuée en rendant une texture à l'aide d'autres textures. Les opérations de réduction peuvent être effectuées en effectuant un rendu itératif vers des textures de plus en plus petites. D'un autre côté, l'accès aléatoire en écriture n'est pas possible de manière efficace (la seule façon de faire est de rendre les triangles par des données de sommet pilotées par la texture). Est-ce possible avec OpenCL ? Quoi d'autre n'est pas possible avec OpenGL ?

1 votes

Une autre question intéressante serait de savoir si OpenGL peut offrir quelque chose qu'OpenCL ne peut pas offrir. Par exemple, OpenGL interpolera automatiquement les données de vertex qui ont été déclarées avec l'attribut varying mot-clé, pour vous. Comment feriez-vous la même chose en OpenCL ?

0 votes

Je pense que cela serait facilement possible en utilisant l'interpolation par un indice donné au noyau de calcul pour chaque invocation.

1 votes

Nous sommes en 2015, nous n'avons toujours pas d'accès fiable à OpenCL sur toutes les plates-formes, nous sommes toujours curieux de savoir quelle qualité de calcul peut être atteinte par OpenCL mais pas par OpenGL2.0.

69voto

cli_hlt Points 4623

OpenCL est créé spécifiquement pour l'informatique. Lorsque vous effectuez des calculs scientifiques à l'aide d'OpenGL, vous devez toujours réfléchir à la manière de faire correspondre votre problème de calcul au contexte graphique (c'est-à-dire parler en termes de textures et de primitives géométriques comme les triangles, etc.

Dans OpenCL, il suffit de formuler le calcul avec un noyau de calcul sur un tampon mémoire et le tour est joué. C'est en fait une GRANDE victoire (je dis cela du point de vue d'une personne qui a réfléchi et mis en œuvre les deux variantes).

Les schémas d'accès à la mémoire sont pourtant les mêmes (votre calcul se déroule toujours sur un GPU - mais les GPU sont de plus en plus flexibles de nos jours).

Mais qu'attendez-vous d'autre que d'utiliser plus d'une douzaine de "CPU" parallèles sans vous casser la tête sur la façon de traduire - par exemple (exemple idiot) Fourier en Triangles et Quads... ?

1 votes

Fourier à Triangles et Quads... bien avec un simple échafaudage de rendu d'un grand quad sur une texture nous avons juste un simple mappage parallèle d'un ou plusieurs grands blocs de mémoire à un autre. Avec des textures de différentes échelles, il est également facile de mapper une quantité différente (généralement 2^n) de valeurs sur une autre. Cela ne représente pas trop de code GL et répond à un grand nombre de problèmes. J'aimerais donc savoir ce qu'OpenCL pourrait faire de plus...

3 votes

En utilisant OpenCL, vous omettez tout simplement le mappage, vous évitez d'écrire les shaders qui devraient traiter la géométrie et les fragments, vous évitez de penser aux diverses transformations de coordonnées (monde, écran/tampon, texture) et vous exprimez directement votre algorithme comme vous l'avez appris dans votre cours de numérique. Je n'ai pas eu de problème avec le premier, mais j'aime plus le second. Et puis, ce n'est pas moi qui ai eu l'idée d'OpenCL, mais comme quelqu'un d'autre l'a fait, pourquoi ne pas l'utiliser comme il se doit ? GPGPU était cool pour son temps, maintenant il suffit d'utiliser OpenCL.

7 votes

@cli_hlt, OpenCL est aussi GPGPU.

66voto

user2746401 Points 415

Un élément qui n'a pas été mentionné dans les réponses jusqu'à présent est la vitesse d'exécution. Si votre algorithme peut être exprimé en graphiques OpenGL (par exemple, pas d'écritures dispersées, pas de mémoire locale, pas de groupes de travail, etc.), il s'exécutera très souvent plus rapidement qu'une contrepartie OpenCL. ), il sera très souvent plus rapide que son homologue OpenCL. Mon expérience spécifique à ce sujet a consisté à réaliser des noyaux de filtres d'images (gather) sur des GPU AMD, nVidia, IMG et Qualcomm. Les implémentations OpenGL s'exécutent invariablement plus rapidement, même après une optimisation hardcore du noyau OpenCL. (aparté : je soupçonne que cela est dû à des années de matériel et de pilotes spécifiquement réglés pour les charges de travail orientées graphiques).

Mon conseil serait que si votre programme de calcul se sent si vous pensez que cela correspond bien au domaine graphique, utilisez OpenGL. Sinon, OpenCL est plus général et plus simple pour exprimer les problèmes de calcul.

Un autre point à mentionner (ou à demander) est de savoir si vous écrivez en tant que hobbyiste (c'est-à-dire pour vous-même) ou commercialement (c'est-à-dire pour une distribution à 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 très peu probable qu'il apparaisse sur Android ou iOS dans les prochaines années. Si la compatibilité entre plates-formes à partir d'une base de code unique est un objectif, alors OpenGL peut vous être imposé.

0 votes

Je pense que cette réponse a vraiment besoin de plus de votes positifs pour apparaître plus tôt dans ce fil de discussion. Les considérations de performance et la compatibilité avec les appareils mobiles devraient être des aspects critiques à prendre en compte en premier lieu... du moins les considérations de performance, au cas où vous n'auriez aucun intérêt pour les appareils mobiles (mais aujourd'hui, comment ne le pourriez-vous pas ou, plutôt, comment pourriez-vous vous permettre de ne pas le faire ? :p)

0 votes

Comment OpenGL peut-il être plus rapide qu'OpenCL ? Il en fait beaucoup plus et la gestion de l'état d'OpenGL est très lourde. Avez-vous comparé à OpenCL avec des fonctions natives_* ? Quel type d'opérations avez-vous comparé ? Pouvez-vous publier le code ?

2 votes

Salut Ben-Uri. Malheureusement, je ne peux pas partager de code. Vous avez raison de dire que l'état du GL est plutôt lourd, mais un code GL bien écrit peut éviter les changements d'état, en particulier pour les tâches de calcul (Vulkan est bien meilleur à cet égard). Les opérations individuelles ont tendance à être à peu près les mêmes entre GL/CL mais les compilateurs GLSL semblent plus matures et produisent un code globalement plus serré. De plus, pour les écritures structurées, les pixel shaders GL peuvent utiliser les unités de sortie de rendu (ROPs) alors que CL doit utiliser le sous-système de mémoire générique (plus lent) car il est (généralement) impossible de savoir au moment de la compilation si les écritures seront structurées.

28voto

Nicol Bolas Points 133791

Quelles sont les caractéristiques qui font d'OpenCL un choix unique par rapport à OpenGL et GLSL pour les calculs ? Malgré la terminologie liée au graphisme et les types de données peu pratiques, y a-t-il un réel problème avec OpenGL ?

Oui : il s'agit d'une API graphique. Par conséquent, tout ce que vous y faites doit être formulé en ces termes. Vous devez conditionner vos données sous la forme d'un "rendu". Vous devez trouver comment traiter vos données en termes d'attributs, de tampons uniformes et de textures.

Avec OpenGL 4.3 et OpenGL ES 3.1 shaders de calcul les choses deviennent un peu plus confuses. Un shader de calcul est capable d'accéder à la mémoire via SSBOs/Image Load/Store de manière similaire aux opérations de calcul d'OpenCL (bien qu'OpenCL offre des pointeurs réels, alors que GLSL ne le fait pas). Leur interopérabilité avec OpenGL est également beaucoup plus rapide que l'interopérabilité OpenCL/GL.

Malgré tout, les shaders de calcul ne changent pas un fait : les opérations de calcul OpenCL fonctionnent à un très une précision différente de celle des nuanceurs de calcul d'OpenGL. Les exigences de précision en virgule flottante de GLSL ne sont pas très strictes, et celles d'OpenGL ES le sont encore moins. 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.

De plus, les shaders de calcul OpenGL nécessitent un matériel compatible avec la norme 4.x, tandis qu'OpenCL peut fonctionner sur du matériel beaucoup plus inférieur.

De plus, si vous faites du calcul en cooptant le pipeline de rendu, les pilotes OpenGL supposeront toujours que vous faites du rendu. Ils vont donc prendre des décisions d'optimisation basées sur cette supposition. Ils optimiseront l'affectation des ressources du shader en supposant que vous dessinez une image.

Par exemple, si vous effectuez un rendu sur 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 inférieure. Si vous utilisez chargement/stockage d'images au lieu d'un framebuffer, vous avez beaucoup moins de chances d'obtenir cet effet.

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

Aussi, OpenCL vous donne juste accès à plus de choses. Il vous donne accès à des niveaux de mémoire qui sont implicites en ce qui concerne GL. Certaines mémoires peuvent être partagées entre les threads, mais les instances de shader séparées dans GL ne peuvent pas affecter directement l'une l'autre (en dehors du chargement/stockage d'image, mais OpenCL fonctionne sur du matériel qui n'a pas accès à cela).

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

Vous peut utiliser OpenGL pour effectuer des calculs arbitraires. Mais vous n'avez pas veulent pas tant qu'il existe une alternative parfaitement viable. Le calcul en OpenGL est au service du pipeline graphique.

Le site seulement La raison de 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 inclut beaucoup de matériel mobile.

6 votes

OpenGL cache ce que le matériel fait derrière une abstraction. OpenCL vous expose presque exactement ce qui se passe" est toujours à un niveau abstrait, je pense. Les GPU ont des modules fixes (comme les "unités de sortie de rendu" et les "unités de mappage de texture") exprimés en caractéristiques OpenGL.

1 votes

@ybungalobill D'après la description de glTexImage2D , "Le GL choisira une représentation interne qui se rapproche de celle demandée par internalFormat, mais qui peut ne pas correspondre exactement".

1 votes

@GuyRT : C'est généralement fait vous donne 32F pour 32F --- le changement typique est un ordre différent des canaux, cependant (par exemple BGRA au lieu de RGBA).

12voto

Damon Points 26437

Une caractéristique notable serait l'éparpillement des écritures, une autre serait l'absence d'"intelligence Windows 7". Windows 7 va, comme vous le savez probablement, tuer le pilote d'affichage si OpenGL n'est pas purgé pendant environ 2 secondes (ne me clouez pas sur le temps exact, mais je pense que c'est 2 secondes). Cela peut être gênant si vous avez une opération longue.

De plus, OpenCL fonctionne évidemment avec une variété de matériel beaucoup plus grande que la seule carte graphique, et il 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.

0 votes

+1 pour la mention de la diffusion, bien que des extensions récentes (telles que shader_image_load_store ), ou vous pouvez utiliser le shader géométrique pour générer des points supplémentaires ou sélectionner des cibles de sortie différentes. Mais rien de comparable à la flexibilité d'OpenCL.

0 votes

Le fait est que vous ne savez pas du tout ce qui se passe car tout dépend essentiellement du conducteur. Bien sûr, vous pouvez faire, par exemple, un accès aléatoire à la mémoire si l'implémentation le permet, mais quel serait l'avantage s'il s'avérait qu'en faisant cela, le pilote transfère tout votre calcul à l'hôte au lieu de la machine sur laquelle votre code est censé fonctionner...

2 votes

@cli_hlt : Vous pouvez décider à l'avance sur quel dispositif vos files d'attente de tâches (et donc vos noyaux) seront exécutées. L'implémentation n'a pas la possibilité de décider quelque chose d'autre plus tard. De plus, des fonctionnalités comme les écritures dispersées ou la mémoire locale ne sont pas quelque chose de "spécial" que le matériel supporte ou ne supporte pas. C'est juste que sous OpenGL, le même matériel ne les exposera pas, car OpenGL implémente un pipeline graphique. En tant que tel, il n'a tout simplement pas de sens pour supporter l'écriture en mémoire locale dans un pixel shader (et le matériel "historique" ne pouvait effectivement pas le faire). Sous OpenCL, cela a du sens et est autorisé.

6voto

Tal Darom Points 655

Une autre raison majeure est qu'OpenGL \GLSL ne sont prises en charge que par les cartes graphiques. Bien que l'utilisation du multi-cœur ait commencé par l'utilisation de matériel graphique, de nombreux fournisseurs de matériel travaillent sur des plates-formes matérielles multi-cœurs destinées au calcul. Par exemple, voir Intels Knights Corner.

Développer du code pour le calcul en utilisant OpenGL \GLSL vous empêchera d'utiliser tout matériel qui n'est pas une carte graphique.

0 votes

Je pense qu'OpenCL empêchera également mon code de fonctionner efficacement sur tout matériel qui n'est pas une carte graphique aujourd'hui Parce que le calcul parallèle favorable fait dans OpenCL est bien adapté pour les GPU mais assez inefficace sur les CPU actuels.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X