« Les cartes graphiques/Les processeurs de shaders » : différence entre les versions

Contenu supprimé Contenu ajouté
Balise : Révoqué
Ligne 90 :
 
Trouver suffisamment d’instructions indépendantes d'une lecture dans un shader n'est donc pas une chose facile. Les améliorations au niveau du compilateur de shaders des drivers peuvent aider, mais la marge est vraiment limitée. Pour trouver des instructions indépendantes d'une lecture en mémoire, le mieux est encore d'aller chercher dans d'autres shaders… Sans la technique qui va suivre, chaque shader correspond à un programme qui s’exécute sur toute une image. Avec les techniques de multi-threading matériel, chaque shader est dupliqué en plusieurs copies indépendantes, des threads, qui traitent chacun un morceau de l'image. Un processeur de shader peut traiter plusieurs threads, et répartir les instructions de ces threads sur l'unité de calcul suivant les besoins : si un thread attend la mémoire, il laisse l'unité de calcul libre pour un autre. Mais cette technique a un inconvénient : il faut que le processeur de ''shader'' dispose d'un ''shader'' près à être exécuté sous à la main, et qu'ils puisse être exécuté sur des données indépendantes de la texture en cours de lecture.
 
==La répartition entre ''pixel shaders'' et ''vertex shaders''==
 
Un triangle est impliqué dans plusieurs pixels lors de l'étape de rastérisation. Un triangle peut donner quelques pixels lors de l'étape de rastérisation, alors qu'un autre va couvrir 10 fois de pixels, un autre seulement trois fois plus, un autre seulement un pixel, etc. Et vu que chaque triangle est impliqué dans plusieurs pixels, cela fait qu'il y a plus de travail à faire sur les pixels que sur les sommets. C'est un phénoméne d'amplification, qui fait que les processeurs de ''shader'' sont plus occupés à exécuter des ''pixel shaders'' que des ''vertex shader''.
 
===Les architectures avec unités de ''vertex'' et ''pixels'' séparées===
 
Les premières cartes graphiques avaient des processeurs séparés pour les ''vertex shaders'' et les ''pixel shaders''. Cette séparation entre unités de texture et de sommets était motivée par le fait qu'à l'époque, les unités de traitement de pixels doivent accéder aux textures, mais pas les unités de traitement de la géométrie. Ces architectures ont beaucoup plus de processeurs de ''pixel shaders'' que de processeurs de ''vertex shaders''.
 
[[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=1.5|Carte 3D avec pixels et vertex shaders non-unifiés.]]
 
Pour donner un exemple, c'était le cas de la Geforce 6800. Elle comprenait 16 processeurs pour les ''pixel shaders'', alors qu'elle n'avait que 6 processeurs pour les ''vertex shaders''.
 
[[File:GeForce 6800.png|centre|vignette|upright=2|Architecture de la GeForce 6800.]]
 
===Les architectures avec unités de ''shaders'' unifiées===
 
Depuis DirectX 10, il n'y a plus de distinction entre processeurs de ''vertex shaders'' et de ''pixels shaders'', chaque processeur pouvant traiter indifféremment l'un ou l'autre. Cela a un avantage considérable, car tous les jeux vidéo n'ont pas les mêmes besoins. Certains ont une géométrie très développée mais peu de besoin en termes de textures, ce qui fait qu'ils gagnent à avoir beaucoup d'unités de gestion de la géométrie et peu d'unités de traitement des pixels. À l'inverse, d'autres jeux vidéo ont besoin de beaucoup de puissance de calcul pour les pixels, mais arrivent à économiser énormément sur la géométrie. L'usage de ''shaders'' unifiés permet d'adapter la répartition entre ''vertex shaders'' et ''pixels shaders'' suivant les besoins de l'application, là où la séparation entre unités de vertex et de pixel ne le permettait pas.
 
[[File:Architecture de base d'une carte 3D - 6.png|centre|vignette|upright=1.5|Carte 3D avec ''pixels'' et ''vertex shaders'' unfifiés.]]
 
{{NavChapitre | book=Les cartes graphiques