Preview : NVIDIA GeForce 6800 Ultra

Publié le 14/04/2004 par et
Imprimer
Pixel Shader 3.0
NVIDIA n´a décidément pas été fainéant au moment de concevoir ses nouveaux pipelines. En plus de toutes les améliorations destinées à les rendre plus efficaces, NVIDIA leur a ajouté le support des Pixel Shader 3.0. Il faut cependant préciser que la tâche n´était pas bien compliquée car les GeForce FX étaient déjà proches du support de ces Pixel Shader dernière version.



La grosse nouveauté introduite par les Pixel Shader 3.0 sont les branchements dynamiques. Ils permettent de réaliser facilement des effets complexes et de n´utiliser qu´un seul et même shader pour des effets différents.

Par exemple un pixel shader 3.0 pourrait intégrer différentes versions d´un algorithme gérant les effets de lumière. Suivant le pixel il déciderait via un branchement dynamique quel effet de lumière appliquer. Cela pourrait permettre d´éviter les changements de shader qui sont coûteux mais aussi de pouvoir éviter certains calculs. Par exemple dans le calcul de plusieurs sources lumineuses qui s´additionnent, le shader pour tester le pixel et arrêter d´additionner de la lumière si le pixel est déjà blanc. Les utilisations possibles sont nombreuses et comme à chaque fois attendent les idées des développeurs.

Cependant, tout n´est pas rose. La chose la plus facile à faire avec les branchements dynamiques c´est de saccager les performances ! Les branchements dans un GPU sont très coûteux. Outre le coût normal du branchement, étant donné le fonctionnent en SIMD des quad engine (4 pixel pipelines), ils ne peuvent pas traiter 2 opérations différentes pour 2 pixels différents.

Ceci signifie que si les branchements donnent des résultats différents pour les 4 pixels adjacents, le quad engine ne pourra plus traiter qu´un pixel à la fois au lieu de 4 ! ¾ des pixels pipelines se tourneront donc les pouces. Ceci aurait pour effet immédiat de diviser les performances en 4.

Ensuite, sans branchement dynamique, le driver et/ou le GPU savent à l´avance ce qu´ils vont devoir faire. Ils peuvent donc optimiser certaines choses comme masquer la latence énorme requise par le texturing. Avec les branchements dynamiques, ils peuvent devenir incapables de le faire ce qui transformerait le GeForce 6800 Ultra en escargot. Bref, les développeurs devront être prudents avec les branchements.
Les PS 3.0 à l´heure du test ?
Les drivers NVIDIA utilisés pour ce test sont très loin d´être prêts au niveau des Pixel Shader 3.0. NVIDIA n´a pas été en mesure de nous fournir une version plus avancée des drivers, ce qui semble indiquer qu´il faudra encore patienter un moment avant d´avoir un support correct de cette nouvelle version des Pixel Shader.


Ces drivers les supportent malgré tout, une fois DirectX 9.0c installé. Ce support est cependant très loin de coller aux documents fournis par NVIDIA. Alors que NVIDIA annonce pouvoir exécuter 65536 instructions (bien que la limite fixée par DirectX soit de 32168), les drivers la fixent à 1024.

Nous avons voulu en savoir plus sur les performances et possibilités des Pixel Shader 3.0. Le dernier patch de Far Cry les supportant, nous avions sous la main un outil idéal. Enfin, nous le pensions. Far Cry détecte bien DirectX 9.0c, tout comme le support des Pixel et Vertex Shader 3.0 de la GeForce 6800 Ultra mais ne les utilise pas ! Bug du jeu ? Support anecdotique ? Bug des drivers ?

L´équipe de développement de PowerVR qui a pas mal travaillé sur les Pixel et Vertex Shader 3.0 (tant au niveau software que hardware) a publié il y a quelques mois plusieurs démos faisant appel aux Pixel Shader 3.0. Ces démos ne pouvaient tourner qu´en mode software auparavant. Tournent-elles correctement sur le GeForce 6800 ? Non.

Elles ne se lancent d´ailleurs même pas. Elles sont en fait tout simplement incompatibles avec DirectX 9.0c qui a introduit quelques limitations dans les Pixel Shader 3.0. Il est ainsi interdit d´utiliser des textures dépendantes et quelques autres instructions à l´intérieur d´une branche. Cette nouvelle limitation n’avait pas pu être prise en compte au moment de la réalisation des démos vu qu´elle n´existait pas. Cette limitation a-t-elle été introduite par Microsoft pour coller à celles du hardware ?

Nous avons donc dû nous résoudre à tester les Pixel Shader 3.0 via quelques petits shaders écrits en assembleur par nos soins (étant donné que le compilateur HLSL ne gère pas encore les Pixel Shader 3.0). Nous n´avons cependant pas eu le temps de tester ce point en profondeur. Nous nous sommes concentré sur le coût des branchements en évitant de saccager les performances d´avance. Par exemple nous avons effectué un branchement réalisé sur une valeur qui dépend du triangle. Les 4 pipelines de chaque quad engine peuvent ainsi fonctionner en même temps. Nous avons bien entendu éviter toute utilisation de texture. Ce test ressemblait à ceci :
If xxxx
Ecran rouge
Else
Ecran vert
Endif
C´est le branchement le plus simple que nous pouvions réaliser. Il a nécessité pas moins de 9 passages dans le pipelines ce qui est énorme. Nous nous attendions à 2 passages en espérant que NVIDIA ait prévu son architecture pour que ça puisse se faire en un seul. Ce résultat nous a donc déçu, mais il est cependant possible qu’il ne soit attribuable qu´aux drivers peu avancés : l´avenir nous le dira !
Vos réactions

Top articles