NVIDIA GeForce 8800 GTX & 8800 GTS

Publié le 08/11/2006 (Mise à jour le 12/02/2007) par
Imprimer
Performances branchements
L’une des principales nouveautés qui a été introduite avec le GeForce 6800 est le branchement dynamique dans les pixel shaders. Cela permet de faciliter l’écriture de certains shaders et d’augmenter l’efficacité d’autres shaders en évitant de calculer une partie de ceux-ci sur les pixels qui n’en ont pas besoin. Par exemple pourquoi appliquer le filtrage très coûteux de l’adoucissement de bordure d’une ombre si le pixel est au milieu de l’ombre ? Un branchement dynamique permet de détecter si le pixel en a besoin ou pas. Splinter Cell Chaos Theory utilise cette technique alors que Les Chroniques de Riddick calcule tout pour chaque pixel. Les performances baissent de 10 à 15% dans le premier cas et de plus de 50% dans le second. Bien entendu les algorithmes ne sont pas identiques mais cela donne une image de ce que peuvent permettre les branchements dynamiques.


Mais tout n’est pas si rose puisque ceux-ci ne sont efficaces que dans des cas bien précis. Les branchements ont une réputation d'être difficile à gérer, c'est particulièrement le cas dans les CPU qui doivent prédire le résultat du branchement à l'avance pour masquer la latence du calcul de celui-ci. Dans un GPU, les pixels sont traités par groupes de dizaines, de centaines voire de milliers de pixels, ce qui permet de masquer automatiquement cette latence. Le problème des CPUs n'existe donc pas réellement. Par contre un autre problème se pose. Lors d’un branchement, tous les pixels doivent prendre la même branche sans quoi les 2 branches doivent être calculées pour tous les pixels, avec des masques pour n’écrire que le résultat de la branche requise pour chaque pixel.

Nous avons développé un petit test qui nous permet de modifier la granularité du branchement, c'est-à-dire le nombre moyen de pixels consécutifs qui vont prendre une même branche. Nous spécifions la branche à prendre par colonne de pixels, une colonne sur 2 doit afficher un shader complexe et l'autre peut passer cette partie du rendu. Des triangles de taille moyenne en mouvement sont affichés à l'écran et traversent ces zones qui utilisent différentes branches, ce qui implique que tant les triangles et leur position que la taille de la colonne influent sur l'efficacité du branchement ce qui est proche d'une situation réelle.


Avec des colonnes étroites, les GPU ne peuvent pas profiter du branchement pour éviter la partie complexe sur la moitié des pixels, mais par contre doivent traiter les instructions de branchement, ce qui fait baisser les performances au lieu de les augmenter. Tout du moins sur les GeForce 7. ATI dispose d'une unité dédiée aux branchements qui travaille en parallèle des pipelines de pixel shading et de texturing ce qui masque le coût des instructions de branchement. Il en est probablement de même pour le GeForce 8800 qui bénéficie cependant d'un gain de performances même quand il semble impossible que ce soit le cas. A l'heure actuelle, Nvidia n'a pas pu nous expliquer ce comportement qui semble indique que le GeForce 8800 est capable d'économiser des ressources autres que la puissance de calcul.

Gros avantage des Radeon depuis plus d'un an, les branchements dynamiques sont maintenant traités plus efficacement du côté de Nvidia. La taille des threads de pixels sur le GeForce 8800 est de 32 pixels contre 48 pour le Radeon X1950 ce qui permet à la nouvelle puce de Nvidia de prendre les devants. Nous précisons threads de pixels puisque dans le cas de threads de vertices, la granularité est de 16 vertices. Notez que les Radeon X19x0 produisent des résultats moins prédictibles que les Radeon X1800 sur ce test (le résultat étrange avec une colonne de 16 pixels en témoigne). Nous supposons que cela est dû à une manière complexe de l'architecture de distribuer les pixels aux shader cores qui entraînerait une baisse d'efficacité avec les groupes de 48 pixels.

Nous avons ensuite exécuté un second test lié aux branchements dynamiques. Cette fois nous avons rendu une fractale d'une manière classique et ensuite à base de branchements. Cet algorithme utilise un nombre élevé d'itérations identiques qui dans le shader classique se retrouvent les une à la suite des autres. Dans le shader à base de branchements, nous avons utilisé une boucle autour de 2 itérations avec un test qui vérifie si le calcul d'itérations supplémentaires est utile ou pas. Si il n'est pas utile nous sortons de la boucle en laissant tomber les itérations qui ne sont pas nécessaires.


Force est de constater que le GeForce 7 étale ici toute son inefficacité face à ce genre de code. Le Radeon X1950 XTX s'en sort d'une manière correcte, mais le GeForce 8800 met tout le monde d'accord. C'est lui le maître à bord maintenant !
Vos réactions

Top articles