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.
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.
0 votes
1) Le dispositif OpenCL peut être un cpu, sans aucun gpus et fonctionner quand le rendu graphique échoue.
0 votes
2) Considérez quelle pile est la plus fine, par exemple sur un noyau linux barebone ? OpenCL qui ne nécessite que des choses simples comme un pilote, amdgpu-pro, livré avec toutes les librairies nécessaires (j'ai fait un firmware de mineur OpenCL avec seulement 50mb d'empreinte). Ou un moteur de rendu (150+mb) qui nécessite plus de manipulations, plusieurs frameworks lourds, des xorgs et ainsi de suite, et les choses sont faites comme à l'intérieur de mesa3d/gallium et ainsi de suite. à quoi tout cela sert-il ? si votre tâche consiste uniquement à calculer et que vous n'avez pas de serveur x en cours d'exécution, et même, pas de moniteur attaché. donc, fondamentalement, GL est plus "surchargé" que CL, afin de supporter tout et n'importe quoi développé depuis des années.