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

m
 
[[File:Instructions SIMD.png|centre|vignette|upright=2.0|Instructions SIMD]]
 
Les cartes graphiques anciennes avaient des jeux d'instructions séparés pour les unités de vertex shader et les unités de pixel shader et les processeurs étaient séparés. Depuis DirectX 10, ce n'est plus le cas : le jeu d'instructions a été unifié entre les vertex shaders et les pixels shaders et un processeur de shader peut effectuer aussi bien des calculs géométriques que des traitements de pixels.
 
La première carte graphique commerciale destinée aux gamers à disposer d'une unité de vertex programmable est la Geforce 3. Celui-ci respectait le format de vertex shader 1.1. L'ensemble des informations à savoir sur cette unité est disponible dans l'article "A user programmable vertex engine", disponible sur le net. Le processeur de cette carte était capable de gérer un seul type de données : les nombres flottants de norme IEEE754. Toutes les informations concernant la coordonnée d'une vertice, voire ses différentes couleurs, doivent être encodées en utilisant ces flottants. Ce processeur est capable d’exécuter 17 instructions différentes. Voici la liste de ces instructions :
|}
 
Comme on le voit, ces instructions sont presque toutessurtout des instructions arithmétiques : multiplications, additions, exponentielles, logarithmes, racines carrées, etc. À côté, on trouve des comparaisons (SDE, SLT), une instruction MOV qui déplace le contenu d'un registre dans un autre, et une instruction de calcul d'adresse. Fait intéressant, toutes ces instructions peuvent s’exécuter en un seul cycle d'horloge. On remarque que parmi toutes ces instructions arithmétiques, la division est absente. Il faut dire que la contrainte qui veut que toutes ces instructions s’exécutent en un cycle d'horloge pose quelques problèmes avec la division, qui est une opération plutôt lourde en hardware. À la place, on trouve l'instruction RCP, capable de calculer 1/x, avec x un flottant. Cela permet ainsi de simuler une division : pour obtenir Y/X, il suffit de calculer 1/X avec RCP, et de multiplier le résultat par Y.
 
S'ilÀ n'ycôté, avaiton aucunetrouve instructiondes d'accèscomparaisons à(SDE, laSLT), mémoireune surinstruction leMOV processeurqui dedéplace lale Geforcecontenu 3,d'un laregistre situationdans aun changéautre, depuiset :une lesinstruction cartesde graphiquescalcul récentesd'adresse. peuventFait allerintéressant, liretoutes certainesces donnéesinstructions depuispeuvent las’exécuter mémoireen vidéo.un Généralement,seul lescycle shadersd'horloge. lisentIl desn'y texturesavait enaucune mémoireinstruction vidéo, textures qui serventd'accès à colorierla lesmémoire pixelssur oule àprocesseur configurerde lesla calculsGeforce d'éclairage3. EtMais la plupartsituation desa carteschangé graphiquesdans suivantles lacartes Geforcegraphiques 2ultérieures, qui incorporait des instructions de lecture de texture. Les écritures, plus rares, sont venues après, afin de faciliter certaines techniques de rendu dont je ne parlerais pas ici. Les cartes graphiques récentes peuvent aller lire ou écrire certaines données depuis la mémoire vidéo à des adresses arbitraires. Les modes d'adressages sont aussi devenus plus complexes.
 
Autre manque : les instructions de branchement. C'est un fait, ce processeur ne peut pas effectuer de branchements. À la place,Geforce il3 doit: simuler ceux-ci en utilisant desles instructions arithmétiques. C'est très complexe, et cela limite un peu les possibilités de programmationbranchement. À l'époque, ces branchements n'étaient pas utiles, sans compter que les environnements de programmation ne permettaient pas d'utiliser de branchements lors de l'écriture de shaders. De nos jours, les cartes graphiques récentes peuvent effectuer des branchements, oumais duelles moins,disposent desaussi instructionsde similairestechniques permettant de s'en passer facilement grâce à un registre appelé le Vector Mask Register. OnCelui-ci pourraitpermet croirede questocker l’absencedes informations qui permettront de branchementssélectionner posecertaines problème,données maiset lespas concepteursd'autres pour faire notre calcul. Il est mis à jour par des instructions de processeurcomparaison. ontCe implémentéVector diversesMask solutionsRegister va stocker un bit pour palierchaque flottant présent dans le vecteur à traiter, bit qui indique s'il faut appliquer l'instruction sur ce manqueflottant. Si ce bit est à 1, notre instruction doit s’exécuter sur la donnée associée à ce bit. Sinon, notre instruction ne doit pas la modifier. On peut ainsi traiter seulement une partie des registres stockant des vecteurs SIMD.
 
* Certains processeurs utilisent des instructions à prédicats, des instructions "annulables" qui ne s’exécutent que si une condition est remplie.
* D'autres instructions ne modifient un élément d'un vecteur que si celui-ci remplit une condition. Pour cela, le processeur de traitement de vertices contient un Vector Mask Register. Celui-ci permet de stocker des informations qui permettront de sélectionner certaines données et pas d'autres pour faire notre calcul. Il est mis à jour par des instructions de comparaison. Ce Vector Mask Register va stocker un bit pour chaque flottant présent dans le vecteur à traiter, bit qui indique s'il faut appliquer l'instruction sur ce flottant. Si ce bit est à 1, notre instruction doit s’exécuter sur la donnée associée à ce bit. Sinon, notre instruction ne doit pas la modifier. On peut ainsi traiter seulement une partie des registres stockant des vecteurs SIMD.
 
[[File:Vector mask register.png|centre|vignette|upright=2.0|''Vector mask register'']]
 
Les cartes graphiques anciennes avaient des jeux d'instructions séparés pour les unités de vertex shader et les unités de pixel shader et les processeurs étaient séparés. Depuis DirectX 10, ce n'est plus le cas : le jeu d'instructions a été unifié entre les vertex shaders et les pixels shaders et un processeur de shader peut effectuer aussi bien des calculs géométriques que des traitements de pixels.
De nos jours, les processeurs de vertices sont capables de gérer des nombres entiers, et les instructions qui vont avec.
 
Pour résumer, les améliorations ont porté sur :
* le nombre de registres ;
* la taille de la mémoire qui stocke les shaders ;
* le support des branchements ;
* l'ajout d'instructions d'appel de fonction ;
* le support de fonctions imbriquées ;
* l'ajout d'instructions de lecture/écriture en mémoire centrale ;
* l'ajout d'instructions capables de traiter des nombres entiers ;
* l'ajout d'instructions bit à bit.
 
===Les registres des processeurs de shaders===
40 954

modifications