Section 2: L’architecture des Gpu DirectX9.0c (Nvidia Geforce 6 et 7)
2.1) Le GeForce 6 (GeForce 6800Ultra, aussi appelé: nv40)
[center]http://chezjuju.123.fr/to/archis_gpus/nalu_640.jpg
Nalu - démo technologique pour le GeForce 6,
affiché ici par une GeForce 6800Gt (merci à SanYohan pour cette capture :jap: )
(cliquer sur l’image pour l’agrandir)[/center]
Partant du constat que l’architecture du GeForce FX n’était pas pleinement efficace, nvidia a décidé de sortir l’artillerie lourde pour rattraper son retard!
Le Ge Force 6800Ultra est composé de pas moins de 16 Pixels Pipelines(!) arrangés en 4 groupes de Quad pipelines de type SIMD (Single Instruction Multiple Data): les 4 pixel pipelines exécutent la même instruction sur des pixels différents.
Notez également que le GeForce 6 supporte DirectX9.0c (les Pixel et Vertex Shaders 3.0).
Commençons notre tour d’horizon par le Pixel Pipeline du GeForce 6800Ultra (nv 40):
Sachez que vu le manque d’efficacité du pixel pipeline du nv30, on aurait pu penser que nvidia allait concevoir des pipelines plus simples sur le nv40. Il n’en est rien, nvidia utilisant ici des pipelines encore plus complexes que ceux du GeForce FX.
Pour bien comprendre, il y a un petit schéma
http://chezjuju.123.fr/to/archis_gpus/archi_nv40.png
Les pixels pipelines du Nv40 disposent comme ceux du GeForceFX d’une unité arithmétique (ALU 1)contrôlant la seule unité de texturing par pixel (exit donc la possibilité de faire du dual texturing.). Cependant il y a une différence avec l’unité de calcul du GeForce FX, contrairement à ce qui se passe dans ce dernier, l’ALU 1 du NV 40 peut à la fois exécuter certaines instructions des pixels shaders tout en contrôlant l’unité de texturing. De plus lorsque l’Alu n’effectue pas de texturing elle est capable d’effectuer des instructions en co-issue amélioré (l’unité peut calculer soit 4 composantes - rouge, vert, bleu, transparence - d’un pixel, soit 3 composantes d’un pixel et 1 d’un autre pixel, soit , ici 2composantes d’un 1 pixels et 2composantes d’un autre pixel)
L’unité ALU1 perd la possibilité d’effectuer en une passe l’instruction SINCOS, selon nvidia le traitement de cette instruction n’apportait des gain que dans les démos technologiques.
On retrouve ensuite une unité mini ALU, cette unité n’est plus aussi complexe que dans le GeForce FX, elle se rapproche des petites unités du R300, du coup elle n’exécute ici que des tâches simples, comme des déplacement de données ou des modifiers. (Les modifiers sont des opérations simples du type x2, x4, etc… La présence de cette unité de calcul permet de délester la grosse unité de calcul des calculs simples, la laissant s’occuper des calculs plus complexes.)
Vient ensuite une nouvelle unité FP 32 (ALU 2) identique à la précédente (ALU 1) à ceci près que cette unité ne peut ici pas piloter d’unité de texturing. Notez que comme l’ALU 1 elle peut fonctionner en CO-Issue, et ce de manière indépendante (par exemple, l’ALU 1 peut être en train de traiter 3+1 composantes - 3 sur un pixel et 1 pur un autre -, alors que l’ALu sera entrain de traiter 2+2 Pixels)
Pour terminer on retrouve une unité mini Alu. Notez que dans le cas du NV 40 les unités mini ALu ne peuvent être exploités efficacement que grâce à une recompilation dynamique (lors de l’exécution, invisible pour l’utilisateur) du Pixel Shader par le pilote.
Je l’ai déjà dit, le NV 40 supporte le Shaders Model 3.0 et donc les pixel Shader 3.0. Evidemment le Shader Model 3.0 permet de gérer plus d’instructions. Mais la plus grosse nouveauté c’est l’apparition du branchement dynamique (Dynamic Branching).
Le branchement dynamique késako?
C’est très simple à comprendre: Il s’agit simplement d’un test, voici un petit exemple:
Si le Pixel P n’est pas blanc,
alors on le colore en blanc,
sinon, on le laisse comme il est sans le traiter.
Bien entendu mon exemple est très simple, le but du branchement dynamique est donc de n’effectuer certaines opérations que lorsque c’est nécessaire, ainsi le GPu n’est pas obligé d’effectuer les calculs pour tous les pixels… D’où le gain de temps … théorique, car il subsiste un problème:
Chaque groupe de 4 Pixel Pieplines ne peuvent utiliser qu’une instruction pour plusieurs pixels, en clair si au sein du même quad pipe les pixels doivent être traité différemment, ils doivent repasser dans le pipe afin de subir les différents traitements!
Il faut savoir également qu’un test de branchement nécessite du temps pour être exécuté, du coup le branchement dynamique , mal utilisé peut être une manière de ruiner les performances (attention ce n’est pas propres au GeForce 6, mais à tous les GPU, même si le processeur de nvidia est particulièrement sensible à ce phénomène)
Je n’en ai pas parlé jusque là (pour éviter une complication inutile), mais il faut savoir que dans un GPU, les pixels sont traités par blocs (à cause de l’architecture SIMD et des Quads, mais pas seulement), dans le cas des GeForce 6, les pixels sont traités par blocs d’environ 1000 pixels.
Cela signifie que si un seul pixel doit recevoir un traitement différent des autres, les 1000 pixels doivent repasser dans le pipeline! Bien entendu seul les pixels qui doivent être traités le seront, mais ça ne fait rien: si un shader emploie des branchements dynamiques mal conçus, les performances du GeForce 6 peuvent tout bonnement dégringoler.
En pratique toutefois le résultat n’est pas aussi dramatique: le compilateur intégré aux pilotes va optimiser au mieux les traitements.
Le moteur géométrique (Vertex Engine)
Lors du passage au nv40, nvidia a également amélioré les unités de calcul géométrique. Ces unités voient leur nombre augmenter: 3 dans les GeForce FX et 6 dans le GeForce 6.
Les unités géométriques du nv40 fonctionnent en mode MIMD (Multiples Instructions, Multiples Datas), cela permet à chaque unité de fonctionner en co-issue. (l’unité peut calculer soit 4 composantes - rouge, vert, bleu, transparence - d’un vertex, soit 3 composantes d’un pixel et 1 d’un autre vertex).
Bien entendu les unités de Vertex Shading du GeForce 6 supportent les Vertex Shaders en version 3.0, du coup cela permet au Ge Force 6 de gérer 2 nouvelles fonctionnalités de DirectX 9.0C:
Le Geometry Instancing
Le Geometry Instancing permet de traiter des ensemble de polygone en une seule passe. Plus les ensemble (batchs) de polygones sont gros, moins les ressources du processeur central sont solicité pour afficher le même nombre d’objets.
Un exemple simple, dans un jeu qui utiliserait les mêmes objets (jeu de stratégie par exemple), il suffit d’envoyer au GPU, en une fois tous les polygones composants ces objets (véhicules par exemple.) pour les afficher. Cela permet de ne pas avoir a éxecuter plusieurs fois les mêmes commandes au niveau du processeur central, le gain de performances peut être important.
Le Vertex Texturing
Comme son nom l’indique le Vertex Texturing permet aux unités de Vertex (unités géométriques) d’accéder aux textures. dans ce cas, il faut voir les textures non pas comme une “simple” image, mais comme un tableau de données.
Ces textures peuvent ici permettre au GPU d’effectuer via ses unité de vertex des déformations par exemple sur une géométrie existante (Displacement Mapping) (il n’est ici pas possible de créer des polygones à partir du Vertex Texturing).
Il est par exemple possible d’utiliser le displacement mapping pourafficher un sol qui se déforme lorsque le personnage marche dessus (sol enneigé, terrain détrempé etc…)
Sur le NV40 chaque unité de Vertex dispose de sa propre unité de texurting. En revanche il faut bien garder à l’esprit que contrairement aux unités de texturing du pixel pipeline, les unités de texturing du Vertex Engine ne sont pas optimisées pour masquer la latence de l’accès mémoire (eh oui, un accès mémoire est lent par rapport à la vitesse du GPU), utiliser le Vertex Tenxturing peut donc se réveler couteux en terme de performances.
Le Nv40 supporte bien entendu le bien connu effet High Dynamic Range (HDR) qui permet de rendre de manière plus réaliste les effets d’éblouissement et de fort éclairage. Notez qu’à cause d’une limitation matérielle, les GeForce6 ne supportent pas l’effet HDR et l’Antialiasing en même temps, cette limitation est également présent sur les GeForce7.
l’Antialiasing
Au niveau de l’Antialising (Anti crénelage, le filtre supprimant, ou réduisant fortement les effets d’escalier sur les objets 3d), si le mode 2X fonctionne de manière relativement similaire à celui du GeForce FX, le résultat visuel est donc comparable à celui obtenu avec un GeForce FX.
En revanche pour le mode 4X nvidia a revu le placement des points de réference, afin d’offrir un rendu bien plus proche de celui qu’offrent les cartes ATI Radeon R300 / R400, bien plus flatteur que le rendu des carte GeForce FX.
L’Anisotropic Filtering (filtrage anisotrope)
Le filtrage anistrope est un filtrage travaillant sur les textures permettant de réduire l’effet de flou qui se créé sur les textures les plus éloignées.
Peu de choses à dire dans ce domaine, si ce n’est que la qualité de filtrage anisotropique est un brin inférieure sur le Nv40 par rapport aux cartes Ati R300 / R400.
Le tour d’horizon du GeForce6 s’arrête la pour l’instant.
Etant donné que le GeForce 7 a une architecture proche de celle du GeForce 6, je me consacrerait dans un premier temps à la réalisation de la partie traitant de l’architecture Ati X1000.
Edité le 15/08/2007 à 09:04