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

Contenu supprimé Contenu ajouté
Ligne 9 :
===Les instructions SIMD===
 
Les instructions des processeurs SIMD manipulent plusieurs nombres en même temps. Elles manipulent plus précisémmentprécisément des vecteurs, des ensembles de plusieurs nombres entiers ou nombres flottants placés les uns à côté des autres, le tout ayant une taille fixe. Une instruction SIMD traite chaque données du vecteur indépendamment des autres. Par exemple, une instruction d'addition vectorielle va additionner ensemble les données qui sont à la même place dans deux vecteurs, et placer le résultat dans un autre vecteur, à la même place. Quand on exécute une instruction sur un vecteur, les données présentes dans ce vecteur sont traitées simultanément.
 
[[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, dont voici les principales :
 
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., Toutesd'une lestaille informationsde concernant32 bits. Par la coordonnéesuite, les processeurs de d'une'shaders'' vertice,ont voireévolué seset différentesles couleurs,types doiventde êtredonnées encodéessupportés ense utilisantsont cesaccrus flottants.: Celes processeurprocesseurs estde capableshaders d’exécuteractuels 17gére instructionsdes différentesflottants de 8, dont16, voici32, lesparfois principales64 :bits, et même des entiers de 32/64 bits.
{|class="wikitable"
|-
!OpCode!!Nom!!Description
|-
! colspan="3" | Opérations mémoire
|-
|MOV||Move||vector -> vector
|-
|ARL||Address register load||miscellaneous
|-
! colspan="3" | Opérations arithmétiques
|-
|ADD||Add||vector -> vector
|-
|MUL||Multiply||vector -> vector
|-
|MAD||Multiply and add||vector -> vector
|-
|MIN||Minimum||vector -> vector
|-
|MAX||Maximum||vector -> vector
|-
|SLT||Set on less than||vector -> vector
|-
|SGE||Set on greater or equal||vector -> vector
|-
|LOG||Log base 2||miscellaneous
|-
|EXP||Exp base 2||miscellaneous
|-
|RCP||Reciprocal||scalar-> replicated scalar
|-
|RSQ||Reciprocal square root||scalar-> replicated scalar
|-
! colspan="3" | Opérations trigonométriques
|-
|DP3||3 term dot product||vector-> replicated scalar
|-
|DP4||4 term dot product||vector-> replicated scalar
|-
|DST||Distance||vector -> vector
|-
! colspan="3" | Opérations d'éclairage géométrique
|-
|LIT||Phong lighting||miscellaneous
|}
 
ÀLes côté,premiers onprocesseurs trouvede une instruction MOV qui déplace le contenu d'un'shaders'', registreceux dansde unla autreGeforce et3 unede instructionNVIDIA, den'avaient calculpas d'adresse, mais aucune instruction d'accès à la mémoire sur le processeur de la Geforce 3. Mais la situation a changé dans les cartes graphiques ultérieures, qui incorporaient 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 lire ou écrire certaines données depuis la mémoire vidéo à des adresses arbitraires, car les modes d'adressages sont aussi devenus plus complexes.
Comme on le voit, ces instructions sont surtout des instructions arithmétiques : multiplications, additions, exponentielles, logarithmes, racines carrées, etc. On remarque que 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.
 
À côté, on trouve une instruction MOV qui déplace le contenu d'un registre dans un autre et une instruction de calcul d'adresse, mais aucune instruction d'accès à la mémoire sur le processeur de la Geforce 3. Mais la situation a changé dans les cartes graphiques ultérieures, qui incorporaient 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 lire ou écrire certaines données depuis la mémoire vidéo à des adresses arbitraires, car les modes d'adressages sont aussi devenus plus complexes.
 
Autre manque de la Geforce 3 : les instructions de branchement. À 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, mais elles disposent aussi de techniques permettant de s'en passer facilement grâce à un registre appelé le 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.
 
===Les registres des processeurs de shaders===