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

Contenu supprimé Contenu ajouté
Ligne 13 :
[[File:Instructions SIMD.png|centre|vignette|upright=2.0|Instructions SIMD]]
 
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. Cele ''Vector Mask Register'' va stockerstocke 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.
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, d'une taille de 32 bits. Par la suite, les processeurs de ''shaders'' ont évolué et les types de données supportés se sont accrus : les processeurs de shaders actuels gére des flottants de 8, 16, 32, parfois 64 bits, et même des entiers de 32/64 bits.
 
Les premiers processeurs de ''shaders'', ceux de la Geforce 3 de NVIDIA, n'avaient pas d'instruction d'accès à la mémoire. 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'']]