Exposé réalisé par: ABID RIM TAIEB IMEN
Plan 1 Introduction 2 Définition d’un GPU 3 Types de GPU 4 Vue d’ensemble d’un GPU 4 Conclusion
Introduction De nos jours, n'importe quel ordinateur disponible sur le marché dispose d'une carte graphique capable d'accélérer l'affichage 3D. Ces cartes ne pouvaient effectuer que des opérations assez basiques, ont très vite évolué vers des systèmes de plus en plus complexes, de plus en plus puissants, et de plus en plus performants.
GPU ? (Graphics Processing Unit) Un GPU est un microprocesseur présent sur les cartes graphiques au sein d’un ordinateur ou d’une console de jeux vidéo. Le GPU se charge des opérations d’affichage et de manipulation de données graphiques. Les GPUs des cartes graphiques modernes (en 2009) ont une structure hautement parallèle qui les rend efficaces pour une large palette de tâches graphiques comme le rendu 3D, en Direct3D , en OpenGL, la gestion de la mémoire vidéo, traitement du signal vidéo…
Peu d’entreprises travaillent sur la conception de tels processeurs : NVIDIA, ATI/AMD, Intel Corporation, le principal fabricant de processeurs graphiques en 2009, et S3 Graphics (de VIA Technologies) se partagent plus de de ce marché fortement disputé. Citons aussi Matrox, 3DLabs, et XGI. Des fabricants (Asus, MSI, PNY …) se chargent ensuite de proposer des cartes graphiques intégrant ces processeurs
Il existe différents types de processeurs graphiques: Carte graphique dédiée: C’est le type le plus puissant. Machines anciennes :Le processeur est généralement situé sur une carte interfacée avec la carte mère de l’ordinateur par un port PCI Express. Ordinateurs portables: certains disposent d’une déclinaison spécifique du port PCI Express, le MXM ou Mobile PCI-Express Module) Ces cartes disposent de leur propre mémoire vive. Il existe aussi le format PCI express 16x qui permet de dépasser les fréquences et les quantités de mémoire qui étaient limitées par le CPI Express(512 Mo en PCI express ,2Go pour le PCI express 16x). La limite du PCI express 16x n’a pas encore été atteintes
Processeurs graphiques intégrés(IGP): Ils sont intégrés dans le northbridge sur la carte mère de l’ordinateur et utilisent sa mémoire vive ou plus rarement une faible quantité de mémoire dédiée . Ils sont moins performant que ceux des cartes graphiques dédiées , mais ils sont moins couteux , plus facile a intégrer et moins gamme , utilisent cette méthode afin de réduire les couts. Les IGP suffisent si le matériel n’est pas sollicité par les jeux modernes .Les cartes mères actuelles ont souvent un processeur graphique intégré et un (ou plusieurs)port permettant d’ajouter une carte graphique dédiée.
Tests alpha, profondeur, Vue d’ensemble Clipping Données Vertices Tessellation Vertex Pipeline Culling Données Primitives Tramage Brouillard, Alpha blending Tests alpha, profondeur, brouillon Pixel Pipeline
Données Vertices Tessellation Données Primitives
Tous les objets d’une image 3D sont constitués de vertex. Un vertex est un point dans un espace à trois dimensions avec des coordonnées des sommets des primitives (X,Y,Z,W) Depuis l'avènement des GPUs programmables (vertex shaders), il est possible d'ajouter au vertex des d’autres informations qui n'ont aucune signification particulière pour la carte graphique (Couleur diffuse et spéculaire, Normale, Coordonnées de textures, Taille du point, Poids du vertex ) W, la coordonnée homogène Couleur diffuse et spéculaire : rouge bleu vert et alpha utilisé notamment pour la transparence
Données Vertices Tessellation Données Primitives Triangle strip:Le nombre de vertices est donc égal au nombre de primitives + deux. Triangle fan:
Une primitive est une forme géométrique simple, allant du point au polygone.Les vertices permettent de former ces formes géométriques Dans le cas d'une primitive de type point, un seul vertex correspondra à une seule primitive. Dans le cas d'un triangle, il en faudra trois pour former la primitive. Il existe quelques types de primitives et les plus utilisées sont : les points , les lignes, Triangle qui est le plus utilisé,(triangle fan ,triangle strip).
Données Vertices Tessellation Vertex Pipeline Données Primitives Le chiffre en haut de chaque triangle représente le niveau de détail. Le niveau 0 est le niveau de "base", c'est à dire qu'il n'y a aucune tessellation. Ensuite, pour chaque niveau, le tessellateur interpole les vertices et augmente ainsi le nombre de triangles.
La tessellation est une technologie récente sur les cartes graphiques. Elle est basée sur l’idée de générer des vertices afin d'augmenter leur nombre et ainsi augmenter la finesse de la surface dont ils font partie. Pour ce faire, la partie du GPU qui s'occupe de la tessellation (le tessellateur) n'a besoin que de deux informations : La position du vertex. La normale. Le tessellateur va interpoler la position et la normale afin de générer de nouvelles vertices entre deux vertices existantes.
Il existe plusieurs algorithmes de tessellation: Le plus simple : Le tessellateur augmente le nombre de vertices jusqu'à arriver à une certaine résolution, mais ce n'est pas très utile : les objets distants seraient très détaillés or les détails ne seraient pas visibles. Une méthode plus adéquate: faire varier le nombre de vertices afin que les objets proches en possèdent beaucoup et que les objets distants en possèdent peu. L'idéal serait augmenter le nombre de vertices afin que chaque vertex corresponde à un pixel à l'écran La tessellation d'un modèle plus complexe: En plus d'interpoler les coordonnées, le tessellateur a également interpolé les normales .C'est pourquoi l'éclairage de la surface s'adapte correctement au fur et à mesure que le nombre de triangles augmente.
les fixes. les programmables. Clipping Vertex Pipeline Tessellation Culling Tramage C’est l’un des éléments les plus importants d'un GPU . Ce pipeline reçoit simplement les données d'un vertex pour les traiter. Il existe deux types de pipelines : les fixes. les programmables.
Le Pipeline Fixe la rotation ou encore l'échelle Il transforme les coordonnées du vertex (sa position) à l'aide de matrices, qui définissent la translation, la rotation ou encore l'échelle à appliquer aux coordonnées. Ensuite, il peut effectuer de simples calculs au niveau de l'éclairage, en se basant sur la position de la lumière et la normale du vertex. Un pipeline fixe est ce qui existe sur les cartes graphiques depuis bien longtemps Il est en quelque sorte un vertex shaders préprogrammé dans la carte graphique //A la place, une matrice 4x4 est générée. Cette dernière comprendra les données de la translation et de la rotation. En effet, si une matrice représente une translation et qu'une autre représente une rotation, en les multipliant on obtient une matrice qui représente la translation ET la rotation. Le pipeline va donc pouvoir transformer les coordonnées du vertex en utilisant cette matrice.
Le Pipeline Programmable (Un vertex shader) Est assez proche du pipeline fixe, sauf que les développeurs peuvent remplacer le mécanisme de traitement des vertices par leurs propres programmes. Avantage principal : une énorme flexibilité au niveau des algorithmes de rendu.
Registres: Un vertex shader est composé de différents éléments: Ils font 128 bits et stockent quatre valeurs. Ils sont assez proches des registres dédiés au SSE présents sur les processeurs de nos machines. Lorsque le vertex shader effectue des opérations sur ces registres, elles sont effectuées en parallèle sur chaque groupe de 32 bits. Rôle: Contenir des valeurs sous forme de 4 nombres en virgule flottante. Cas des coordonnées: chaque composante ira à sa place Cas des couleurs: le rouge correspondra à X, le vert à Y, le bleu à Z et la composante alpha à W. Certains éléments plus importants (comme le poids du vertex) pourront être répartis sur plusieurs registres. Ces registres vont contenir des valeurs. Ces registre ont pour rôle de
Registre r0-r?(Registres temporaires) Registre v0-v? (Registres d'entrée) Leur nombre est limité à 16 Ils contiennent des informations du vertex à traiter (position du vertex, couleur diffuse et spéculaire, sa normale..)pour les amener au vertex shader. Registre r0-r?(Registres temporaires) Ils vont récupérer différentes valeurs issues des opérations qui vont être effectuées par le vertex shader. Ils peuvent contenir plus ou moins n'importe quelle information. (minimum 12 pour les vertex shaders 2.x et 3.0). Il existe différents types de registres, bien que leur fonctionnement soit identique.
Registres c0-c? i0-i?, b0-b?(Registres constants) Ils permettent de définir des valeurs qui ne vont pas changer d'un vertex à l'autre, mais qui seront globales à l'exécution d'un seul et même vertex shader. Ces constantes contiennent les matrices utilisées pour transformer la position des vertices (translation, rotation, etc.), mais peuvent également contenir tout type d'information utile au vertex shader (vitesse du vent, contraintes physiques,..) Registres s0-s3(Registres d’ échantillonage ) Ils permettent d'accéder aux données des textures. Ainsi, chaque registre représente une texture. Ils ne sont présents qu'en 4 exemplaires, ce qui permet tout de même d'accéder aux données de quatre textures différentes à partir d'un vertex shader. Les registres c?? sont probablement les plus nombreux disponibles (minimum 96 pour les vertex shaders 1.0, minimum 256 pour les vertex shaders 2.0 et 3.0). Les registres i?? et b??, quant à eux, ne sont disponibles qu'à partir des vertex shaders 2.0, et sont chacun au nombre de 16.
Registres a0, aL, p0 a0 est disponible dans toutes les versions des vertex shaders C’est un registre d'adressage . aL est apparu avec les vertex shaders 2.0 C’est un registre compteur de boucle. p0 avec les vertex shaders 2.x. C’est le registre attribut. Il est utilisé avec les instructions permettant de faire des branchements conditionnels si plus grand que", "si plus petit que" ou "si égal à".
2.Instructions Le GPU exécutait "bêtement" les instructions les unes après les autres. Il arrivait donc souvent que plusieurs vertex shaders offrant des fonctionnalités quasiment identiques soient créés, avec seulement une ou deux instructions différentes. Le contrôle du le flux des shaders est possible avec: Les Boucles: qui permettent de répéter certaines instructions plusieurs fois. Cela permet également d'économiser des instructions, puisque le nombre d'instructions est limité . Les Branchements Conditionnels: permettent d'effectuer certaines instructions sous certaines conditions, réduisant cette fois-ci le nombre de shaders différents à écrire, plutôt que le nombre d'instructions.
3.Performances Pas mal de choses peuvent influencer les performances du vertex pipeline. Il est donc intéressant de savoir ce qui peut faire qu'une carte graphique sera plus rapide qu'une autre. Unités de traitement des vertices(vertex units) Chaque unité représente en quelque sorte un vertex pipeline. Un vertex pipeline ne traite qu'un seul et unique vertex à la fois, Alors il faut ajouter plusieurs de ces unités pour traiter plusieurs vertices en parallèle. L'avantage est évidemment considérable, puisqu'au niveau du traitement des vertices les performances augmentent de façon pratiquement linéaire. * En effet, la carte graphique reçoit généralement un très grand nombre de vertices à la fois (plusieurs milliers, voire millions), et il est donc très simple de traiter 2, 4, 8, 12 ou 16 vertices d'un coup au lieu d'une seule question : "qu'est-ce qui fait qu'une carte graphique est rapide ?".
Taille et vitesse du bus mémoire: la taille du bus mémoire et sa fréquence détermineront à quelle vitesse les vertices peuvent être envoyés au GPU. Il faut cependant faire attention lors de la lecture de ces informations. Ainsi, une carte disposant d'un bus 128-bit et de mémoire à 300 MHz sera plus lente qu'une carte disposant d'un bus 256-bit et de mémoire à 200 MHz. Le plus simple est de multiplier le nombre de bits par la fréquence pour obtenir une valeur permettant de donner un ordre de performance. Taille des vertices: la taille variable des vertices dépasse une certaine valeur, qui est en général spécifique à une génération de chipset, les performances seront réduites. Nombre d'instructions d'un shader: sans tenir compte du fait que certaines instructions prennent plus de temps que d'autres, les performances d'un vertex shader diminuent très vite avec l'augmentation du nombre d'instructions.
Clipping Vertex Pipeline Culling Tramage
Culling Elle permet de ne pas afficher certaines primitives invisibles. En effet, lorsque les primitives sont affichées, les vertices sont spécifiés dans un certain ordre qui peut être dans le sens des aiguilles d'une montre ou l'inverse. Cependant, ce sens détermine la "face avant" et la "face arrière" d'une primitive. Ceci permet d'augmenter les performances, puisque lors de l'affichage d'un modèle, l'arrière de celui-ci ne sera pas affiché. le culling peut être désactivé, puisqu'il est parfois utile d'afficher les faces arrières des primitives.
Clipping Elle permet de diminuer la quantité de données à afficher en déterminant leur visibilité. En fait, il existe plusieurs types de clipping. Lorsqu'un vertex devrait être affiché "hors" de l'écran, il ne passe pas le test de clipping, et n'est donc pas affiché. Il est possible de définir des plans de clipping qui permettront de définir une zone en dehors de laquelle les informations ne passeront pas le test de clipping.
Tramage Il s’agit de la construction des primitives à partir des vertices Un certain nombre de pixels sera ainsi créé A noter que certains types d'anti-aliasing peuvent déjà être utilisés lors de cette étape, afin notamment de rendre le contour des primitives plus lisse. Une fois ces pixels générés, leurs données sont envoyées au pixel pipeline.
Tests alpha, profondeur, Tramage Tests alpha, profondeur, brouillon Pixel Pipeline
Pixel complet Pixel Pixel Pipeline les coordonnées des textures,.. Tout comme le vertex pipeline, il existe deux versions du pixel pipeline: Une version fixe comme sur les anciennes cartes graphiques Une version programmable : les pixel shaders.
Unités d’applications des textures (TMU) Pixel Pipeline : version fixe Unités d’applications des textures (TMU) L’envoie et le filtrage des textures doivent est effectué par des TMU qui travaillent en conjonction avec les unités de pixel et vertex shaders. Sa tâche consiste à appliquer les opérations de texture aux pixels. Une carte possédant plus de TMU sera plus rapide pour traiter les informations de texture.
Taux de remplissage Le taux de remplissage indique généralement la vitesse à laquelle un processeur graphique peut dessiner des pixels. Il y a deux types de taux de remplissage : Le taux de remplissage des pixels C’est le nombre total de pixels que la carte peut sortir et il est calculé en multipliant le nombre d’opérations de rastérisation (ROP) par la fréquence d’horloge.
taux de remplissage des textures Nvidia: L’obtient en multipliant le nombre de canaux de pixels par la fréquence d’horloge. ATI: Multiplie le nombre d’unités de calcul de texture par la fréquence d’horloge. Ces deux méthodes sont correctes car Nvidia a une unité de texture par unité de shader ou une par canal de pixel.
Pixel Pipeline : version programmable Pixel pipeline :unité de Processeur de pixel Les pixel shaders sont utilisés pour toutes sortes d’effets graphiques impressionnants. On utilise le nombre de pixel shaders d’un processeur graphique pour comparer différentes cartes graphiques au niveau de la vitesse de traitement des pixels.
Instructions Ces instructions vont réaliser des opérations sur les valeurs qui leur sont fournies (par exemple une couleur). D'autres informations sont disponibles comme les coordonnées U/V des textures. Texkill Elle contrôle le flux du pixel pipeline. Elle permet de "tuer" un pixel, c'est à dire d'annuler son rendu. C'est non seulement très utile pour certaines techniques d'affichage, mais cela permet également d'augmenter les performances puisque le pixel n'ira pas plus loin dans le processus de rendu.
Texld (texture load) Permet d'aller chercher des données dans les textures. Ces données peuvent être de simples couleurs, pour l'utilisation la plus classique des textures, ou tout autre type de données. A noter que cette instruction a longtemps été réservée aux pixel shaders, mais qu'elle est disponible dans les vertex shaders 3.0 (c'est d'ailleurs pratiquement la seule différence avec les vertex shaders 2.x).
Pixel Pipeline : performances Nombre de pixel pipelines Plus il y a de pixels à traiter, plus c'est lent. Plus il y a de pipelines capables de les traiter, plus c'est rapide. Les performances sont donc en grande partie définies par le nombre de pipelines disponibles. L'augmentation des performances apportées par ces pipelines supplémentaires tend même à être linéaire, les performances étant pratiquement doublées si le nombre de pipelines est doublé .
C’est une opération qui était gourmande lors de son apparition. Anti-aliasing C’est une opération qui était gourmande lors de son apparition. Les performances étaient grandement dégradées, et elle n'était pas vraiment utilisable. Depuis maintenant quelques générations de cartes graphiques, c'est beaucoup mieux et l'utilisation de l'anti-aliasing peut être une alternative à l'utilisation d'une plus haute résolution. Les performances de l'anti-aliasing ne dépendent pas réellement des spécifications de la carte graphique, et il est donc difficile de deviner à quel point les performances seront affectées
Filtrage anisotropique Le filtrage anisotropique est une technique permettant d'interpoler les pixels afin de lisser les textures, tout comme les filtrages bi-linéaires et tri-linéaires. Le filtrage anisotropique a cependant une certaine influence sur les performances de la carte graphique, bien que de nos jours il ne s'agisse que de quelques images par seconde perdues (et encore).
Tests alpha, profondeur, Brouillard, Alpha blending Tests alpha, profondeur, brouillon Pixel Pipeline
Test alpha Le test alpha permet de contrôler l'affichage des pixels d'après cette composante alpha. Il est possible de ne pas afficher les pixels où la composante alpha est à moins de 50%, par exemple. A noter également que l'utilisation de la transparence consomme une certaine quantité de bande passante, puisqu'il y a techniquement plus de pixels à afficher.
Test de profondeur Le test de profondeur agit plus ou moins comme le test alpha, mais au lieu de se baser sur la composante alpha, il se base sur la profondeur du pixel. Le test de profondeur permet surtout de ne pas avoir à afficher les pixels qui ne seront pas visibles. En effet, si un pixel est déjà présent à une certaine profondeur (chose vérifiée à l'aide du tampon de profondeur), un autre étant au même endroit mais à une plus grand profondeur n'a aucune raison d'être affiché puisqu'on ne le verra pas.
Le Z Buffer - (blanc: proche; noir: loin)
Test brouillon Le test brouillon fonctionne comme le test de profondeur, mais au lieu de tester la profondeur il va tester la valeur qui se trouve dans le tampon brouillon (stencil buffer). Il a de nombreuses utilités, mais est principalement utilisé pour créer des ombres ou autres effets où la forme ou le contour d'un objet sont requis.
Tests alpha, profondeur, Brouillard, Alpha blending Tests alpha, profondeur, brouillon
Brouillard C’est une technique de rendu. C'est ce bon vieux brouillard que l'on voit au loin, pour que les objets n'apparaissent pas d'un coup. Il est tout de même légèrement configurable, et plusieurs formules mathématiques peuvent être utilisées pour choisir où se trouve le brouillard ou sa couleur.
Mélange alpha Différentes formules sont disponibles, permettant de choisir ce qui sera pris en compte, à partir de deux pixels, lors du calcul du pixel qui en résultera. Ces deux pixels sont les pixels de source et de destination (le nouveau pixel et celui qui était déjà présent). Le mélange alpha a un impact sur les performances des cartes graphiques, mais pas un impact direct. Ainsi, n'importe quelle carte graphique peut mélanger deux pixels sans la moindre difficulté et en quelques nanosecondes.
Rendu final Transformation du viewport Le viewport est une forme géométrique (généralement un rectangle) qui définit où les pixels vont se retrouver dans la fenêtre. Ce viewport peut faire en sorte que toute la scène ne soit affichée que sur un morceau de la fenêtre, ce qui peut être utile pour les jeux où l'écran est partagé en deux.
Anti-aliasing L’Aliasing est un terme qui décrit des motifs crénelés ou dont on voit les blocs dans l’affichage des images numériques. Dans le cas du graphisme, cela fait référence à l’effet d’escalier sur les bords anguleux lors de l’affichage à l’écran. L’anti-aliasing ('AA' en abrégé) est une fonction graphique qui diminue cet effet. Cela dit, comme les calculs d’anti-aliasing utilisent une grosse part de la puissance du processeur graphique, l’activer provoque une diminution significative du débit d’images.
Unités de shader / vertex pipeline. Performances globales Unités de shader / vertex pipeline. Les unités de shader s'occupent d'exécuter les vertex et pixel shaders. Lorsque des vertices sont envoyés à la carte graphique, ce n'est pas un seul à la fois, mais bien des milliers. Il est donc très simple d'effectuer leur traitement en parallèle. Du coup, plus y a d'unités de shader, plus vite les vertices sont traités.
Unités de texture / pixel pipelines Les unités de texture s'occupent de gérer les textures. Chaque unité peut contenir une texture. Lors de l'affichage de primitives possédant plus d'une texture, il faut autant d'unités de texture qu'il y aura de textures sur la primitive. Cependant, si il y en a moins (par exemple, il y a quatre unités de texture et six textures doivent être affichées), la primitive devra être affichée une première fois avec les quatre premières textures, puis une seconde fois avec les deux textures restantes, ce qui dégrade grandement les performances.
conclusion Augmentations de la complexité et des performances Nouveau Shader Model Cette augmentation de complexité se caractérise principalement par l'augmentation des possibilités apportées par chaque nouveau shader model. Le shader model 4.0 est en chemin, et apporte une nouvelle fois son lot de nouveautés, notamment la généralisation du système des shaders (ainsi, il n'y aura plus de différence entre un vertex shader et un pixel shader, du point de vue des fonctionnalités). Unités de Texture et de Shader Un autre facteur est l'augmentation des unités de texture ou de shader. La génération qui va bientôt être disponible disposera de jusqu'à 32 unités de shader. La GeForce 3 n'en avait qu'une. Ce n'est peut-être pas la façon la plus élégante d'augmenter les performances d'une carte graphique, mais c'est certainement une des plus efficaces.
Améliorations du rendu Les Geometry Shaders Ces shaders permettent de créer des vertices de façon programmable, mais sans aucune limitation. Il est même possible d'envoyer des vertices à la carte graphique, de leur appliquer un vertex shader (modifiant les vertices), d'appliquer un geometry shader sur les vertices ainsi modifées, et d'appliquer à nouveau un vertex shader. Les possibilités sont donc énormes. Parfait pour le SLI les nouvelles fonctionnalités de DirectX - notamment la mémoire vidéo virtuelle - ont de nombreux avantages lorsqu'il s'agit de découper l'affichage en plusieurs morceaux, chaque morceau pouvant ainsi être traité par un GPU différent.
Bibliographie http://www.erenumerique.fr/3d_la_carte_graphique_expliquee_2_me_partie-art-1343-3.html http://www.pcworld.fr/article/materiel/carte-graphique/architecture-et-fonctionnement-d-un-gpu/108881/ http://fr.wikipedia.org/wiki/GPU
Merci de votre attention