À quoi peuvent servir les shaders exactement?

8

Je ne suis pas vraiment une personne en 3D, et je n'ai utilisé qu'un peu de shaders dans certains exemples de Three.js, et jusqu'à présent, j'ai l'impression qu'ils ne sont utilisés que pour la partie graphique de l'équation.

Cependant, l'article (assez cryptique) de Wikipédia et d'autres sources m'amènent à croire qu'ils peuvent être utilisés pour plus que de simples effets graphiques, c'est-à-dire pour programmer le GPU ( Wikipedia ).

Donc, le GPU est toujours un processeur, non? Avec un jeu d'instructions plus grand et différent pour une manipulation vectorielle plus facile et plus rapide, mais toujours un processeur. Puis-je utiliser des shaders pour faire des programmes réguliers (à condition d'avoir accès à la mémoire vidéo, ce qui est probable)?

Edit: programmes réguliers == "Applications", c'est-à-dire créer des programmes Windows / console, ou au moins avoir un moyen de dessiner des choses sur l'écran, peut-être même en prenant la saisie de l'utilisateur.

jcora
la source
2
Qu'entendez-vous par "programmes réguliers"
kravemir
2
+1 Pour la question de développement de jeu la plus mignonne que j'aie jamais vue, qui a également réussi à repenser ma vision du monde.
knight666
1
"==" est un comparateur, pas un opérateur d'affectation :)
kravemir
2
Ouais, je sais, c'est toujours valable à utiliser. Je ne voulais pas "assigner" l'explication à la définition, je voulais les assimiler.
jcora

Réponses:

13

À l'origine, le matériel de traitement graphique dédié avait un ensemble fixe de fonctions câblées. Il faudrait une géométrie d'entrée, lui faire des choses très spécifiques pour la transformer et la pixelliser, puis diffuser les résultats à l'écran. Au fil du temps, cette fonctionnalité est devenue paramétrisée et finalement programmable. "Shaders" est devenu le terme utilisé pour les programmes qui fonctionnaient sur le GPU, car ils contrôlaient la transformation et l'ombrage de la géométrie.

Au fur et à mesure que le matériel GPU a évolué, de plus en plus est devenu programmable, donc maintenant la plupart des types de shaders que l'on peut écrire ne contribuent qu'indirectement à l'ombrage réel de tout ce qui est à l'écran (je fais référence à des choses comme la géométrie et les shaders de coque ici ). Avec cela est venue la généralisation du GPU en tant que dispositif pour effectuer un traitement basé sur des flux hautement simultanés à grande échelle, de sorte que, bien que l' intention d'un GPU et de shaders soit généralement d'implémenter une sorte d'effet graphique de fantaisie, ils peuvent également être utilisé pour effectuer certains types de calculs à usage général (en particulier ceux qui sont adaptés pour être calculés en parallèle). Ceci est souvent appelé programmation GPU à usage général, ou «GPGPU».

Cependant, le GPU est toujours hautement spécialisé et ne peut pas faire beaucoup de choses qu'un CPU pourrait faire. Il a également une connectivité limitée au reste du matériel d'un système, de sorte que vous ne pouvez pas vraiment écrire des programmes "normaux" (avec sortie console ou entrée souris, et cetera) entièrement sur le GPU. Vous pouvez effectuer des calculs sur le GPU qui ne sont pas destinés à être interprétés comme des rendus, mais ce n'est pas un processeur autonome à part entière.


la source
5

Le GPU ne peut pas dire au CPU quoi faire. Il peut simplement fournir des résultats dans sa mémoire qui liront le CPU.

Les shaders / GPGPU ne peuvent pas être utilisés pour :

  • prendre les entrées utilisateur directement sans CPU , car elles sont implémentées comme des interruptions CPU
  • création de toute application , car les applications sont gérées par le noyau et exécutées par le CPU
  • création de n'importe quelle fenêtre , car le gestionnaire / serveur de fenêtres est exécuté dans le CPU

Les shaders / GPGPU peuvent être utilisés pour :

  • dessiner des trucs sur l'écran / la fenêtre, mais cela doit être contrôlé par le CPU
  • décodage / encodage vidéo
  • traitement d'image dans des éditeurs graphiques professionnels - divers effets exécutables parallèles comme le flou, la netteté des bords, ...
  • calculs physiques

Voir OpenCL . Il peut utiliser des shaders pour des calculs non graphiques.

Modifier en fonction des commentaires:

Les shaders sont utilisés uniquement pour le rendu des graphiques. L'exécution de calculs non graphiques dans le GPU est appelée GPGPU .

kravemir
la source
Le dernier point n'est pas tout à fait vrai, vous n'utilisez pas de shaders pour calculer la physique, vous utilisez l'API GPGPU comme OpenCL et CUDA.
dreta
@dreta Oui. C'est vrai. Sur la base de sa question, je pense qu'il voulait parler des shaders comme unités de traitement du matériel. Il a dit "mais toujours un processeur".
kravemir
2
eh bien, corrigez-le pour avoir tort, pourquoi reconnaissez-vous son idée fausse, il a dit qu'il n'était pas un gourou du rendu, les shaders ne sont pas ambigus, ils ont un rôle spécifique
dreta
-4

Facile. L'unité de traitement graphique a finalement obtenu des shaders, ce qui crée un effet de pantalon fantaisie pour l'ombrage. Cela est devenu programmable, donc les effets sont devenus de plus en plus sophistiqués. Finalement, l'ensemble du GPU est devenu une unité SIMD.

SIMD signifie Single Instrution Muliple Data. Actuellement, les GPU sont comme un arbre. Il a X plusieurs cœurs, chacun ayant Y plusieurs cœurs, ayant Z plusieurs cœurs. Plus vous descendez dans l'arbre, plus la mémoire est rapide et petite, plus les calculs sont parallèles et simples.

Le GPU est donc devenu une sorte de GPU General Purpuse. Ce n'est pas appelé CPU car ce n'est pas l'unité centrale de traitement, même s'il peut gérer les E / S, la gestion de la mémoire et l'ordonnancement.

Inutile de dire que la puissance du GPGPU vient de devoir effectuer des opérations parallèles divisibles sur un grand nombre de données à la fois. Bien qu'il soit donc inutile pour la plupart des logiciels, nVidia travaille à faire du GPGPU un CPU. Ils croient qu'ils peuvent exposer le GPU comme un processeur ARM. Cette technique de traduction se trouve également à l'intérieur des processeurs x86, qui sont RISC à la base.

OpenCL, CUDA et DirectX sont comme un langage de programmation à personnalité partagée. OpenCL, par exemple, fonctionne sur le CPU, mais décharge les "bombes" ("noyaux") qui bénéficient de SIMD, vers le GPU.

Il ne faudra pas longtemps avant que tout soit de style CPU / GPU Fusion / Sandy Bridge.

Vincent
la source
3
-1. Votre choix de mots réduit considérablement la qualité de cette réponse.
bummzack
Le choix des mots n'a en soi aucun sens: en.wikipedia.org/wiki/On_Denoting Par conséquent, cela ne diminue pas la qualité de la réponse, car la qualité n'a rien à voir avec la question, mais la logique. C'est en fait la réponse la plus correcte.
Vincent
2
Le choix des mots est très important. Si vous utilisez un langage offensant, votre réponse ne sera pas considérée comme bonne. Quelqu'un avec une réponse valable passera du temps à s'assurer qu'elle est éloquente et élégante.
Jonathan Pitre
Si vous avez un problème avec la langue, modifiez la réponse. C'est à tout le monde d'améliorer le site.
Tetrad
Si la demande de compréhension logique vient d'un zombie philosophique bicaméraliste, elle me satisferait malgré tout, car la connaissance est égale au pouvoir. Je n'aime pas transmettre le savoir aux bicaméraux qui valorisent l'émotion plus que la logique. Cela améliore seulement la réponse.
Vincent