web-dev-qa-db-fra.com

Quelle est la différence entre OpenCL et le shader de calcul d'OpenGL?

Je sais qu'OpenCL donne le contrôle de l'architecture de mémoire du GPU et permet ainsi une meilleure optimisation, mais, en laissant cela de côté, pouvons-nous utiliser des Shaders de calcul pour les opérations vectorielles (addition, multiplication, inversion, etc.)?

55
Maiss

Contrairement aux autres types de shaders OpenGL, les shaders de calcul ne sont pas directement liés aux graphiques informatiques et fournissent une abstraction beaucoup plus directe du matériel sous-jacent, similaire à CUDA et OpenCL. Il fournit une taille de groupe de travail personnalisable, une mémoire partagée, une synchronisation intra-groupe et toutes ces choses connues et aimées de CUDA et OpenCL.

Les principales différences sont essentiellement:

  • Il utilise GLSL au lieu d'OpenCL C. Bien qu'il n'y ait pas une telle différence énorme entre ces langages de programmation, vous pouvez cependant utiliser toutes les fonctions GLSL liées aux graphiques qui ne sont pas disponibles pour OpenCL, comme les types de texture avancés (par exemple les tableaux de carte de cube), avancés filtrage (par exemple mipmapping, eh bien, vous aurez probablement besoin de calculer le niveau mip vous-même), et de petites choses pratiques comme les matrices 4x4 ou les fonctions géométriques.
  • Il s'agit d'un programme de shaders OpenGL comme tout autre shader GLSL. Cela signifie que l'accès aux données OpenGL (comme les tampons, les textures, les images) est tout simplement trivial, tandis que l'interfaçage entre OpenGL et OpenCL/CUDA peut devenir fastidieux, avec un effort de synchronisation manuelle possible de votre côté. De la même manière, son intégration dans un flux de travail OpenGL existant est également triviale, tandis que la configuration d'OpenCL est un livre à part entière, sans parler de son intégration dans un pipeline graphique existant.

Donc, cela revient à dire que les shaders de calcul sont vraiment destinés à être utilisés dans les applications OpenGL existantes, bien qu'ils présentent l'approche de calcul habituelle (comme OpenCL/CUDA) pour la programmation GPU, contrairement à l'approche graphique de l'autre shader étapes, qui n'avaient pas la flexibilité de calcul d'OpenCL/CUDA (tout en offrant d'autres avantages, bien sûr). Ainsi, effectuer des tâches de calcul est plus flexible, direct et facile que de les compresser dans d'autres étapes de shader non destinées à l'informatique générale ou d'introduire un cadre informatique supplémentaire avec lequel vous devez vous synchroniser.

Les shaders de calcul devraient être capables de faire presque tout ce qui est réalisable avec OpenCL avec la même flexibilité et le même contrôle sur les ressources matérielles et avec la même approche de programmation. Donc, si vous avez un bon algorithme adapté au GPU (qui fonctionnerait bien avec CUDA ou OpenCL) pour la tâche que vous souhaitez effectuer, alors oui, vous pouvez également le faire avec des shaders de calcul. Mais cela n'aurait pas beaucoup de sens d'utiliser OpenGL (qui est toujours et sera probablement toujours un cadre pour les graphiques informatiques en temps réel en premier lieu) uniquement à cause des shaders de calcul. Pour cela, vous pouvez simplement utiliser OpenCL ou CUDA. La véritable force des shaders de calcul entre en jeu lors du mélange de graphiques et de capacités de calcul.

56
Christian Rau

Regardez ici pour une autre perspective. Résumant:

Oui, OpenCL existait déjà, mais il cible les applications lourdes (pensez CFD, FEM, etc.), et il est beaucoup plus universel qu'OpenGL (pensez au-delà des GPU) ... L'architecture Intel Xeon Phi prend en charge> 50 cœurs x86).

De plus, le partage de tampons entre OpenGL/CUDA et OpenCL n'est pas amusant.

3
Rahul Banerjee