# TeraScale (microarchitecture)

TeraScale est le nom de code d’une famille de microarchitectures de processeurs graphiques (GPU) développée par ATI Technologies/AMD et leur deuxième microarchitecture implémentant le modèle de shader unifié après Xenos qui équipait la Xbox 360. TeraScale a remplacé les anciennes microarchitectures à pipeline fixe et a été en concurrence directe avec la première microarchitecture de shader unifié de Nvidia nommée Tesla$^,$. TeraScale a été utilisée dans les cartes graphiques Radeon HD 2000 fabriquées en 80 nm et 65 nm, HD 3000 fabriquées en 65 nm et 55 nm, HD 4000 fabriquées en 55 nm et 40 nm, HD 5000 et HD 6000 fabriquées en 40 nm. TeraScale a également été utilisée dans les unités de traitement accéléré (APU) d'AMD portant les noms de code « Brazos », « Llano », « Trinity » et « Richland ». TeraScale se trouve même dans certaines des marques de cartes graphiques suivantes.
TeraScale est une architecture SIMD VLIW, tandis que Tesla est une architecture SIMD RISC, similaire au successeur de TeraScale, Graphics Core Next. TeraScale implémente HyperZ (en).
Un générateur de code LLVM (c’est-à-dire un back-end de compilateur) est disponible pour TeraScale, mais il semble manquer dans la matrice de LLVM. Par exemple, Mesa 3D l’utilise.

## TeraScale 1 (VLIW5)

Lors du SIGGRAPH 08 en décembre 2008, Mike Houston, employé d’AMD, a décrit une partie de la microarchitecture TeraScale.
À FOSDEM09 Matthias Hopf, de SUSE Linux, partenaire technologique d’AMD, a présenté une diapositive concernant la programmation d’un pilote open source pour le R600.

### Shaders unifiés

Les architectures GPU précédentes implémentaient des pipelines fixes, c’est-à-dire qu’il y avait des processeurs de shader distincts pour chaque type de shader. TeraScale exploite de nombreux processeurs de shader flexibles qui peuvent être programmés pour traiter une variété de types de shaders, augmentant ainsi considérablement le débit GPU (en fonction de la combinaison d’instructions d’application, comme indiqué ci-dessous). Le cœur R600 traite les shaders de vertex, de géométrie et de pixels comme indiqué par la spécification Direct3D 10.0 pour Shader Model 4.0, en plus de la prise en charge complète d’OpenGL 3.0.
La nouvelle fonctionnalité de shader unifié est basée sur une architecture VLIW (Very Long Instruction Word) dans laquelle le cœur exécute des opérations en parallèle.
Un cluster de shaders est organisé en 5 unités de traitement de flux (stream processor, stream processing unit, SPU). Chaque unité de traitement de flux peut traiter une instruction MAD (ou ADD ou MUL) en virgule flottante simple précision par cycle d'horloge, un produit scalaire (DP et des cas spéciaux en combinant des ALU) et un ADD entier. La 5ème unité est plus complexe et peut prendre en charge des fonctions spéciales transcendantes telles que le sinus et le cosinus. Chaque cluster de shaders peut exécuter 6 instructions par cycle d’horloge (au maximum), composées de 5 instructions de shader et d’un branchement.
Cependant, l’architecture VLIW apporte avec elle certains défis classiques inhérents aux conceptions VLIW, à savoir celui de maintenir un flux d’instructions optimal. De plus, la puce ne peut pas co-émettre d’instructions lorsque l’une dépend des résultats de l’autre. Les performances du GPU dépendent fortement du mélange d’instructions utilisé par l’application et de la capacité du compilateur en temps réel du pilote à organiser ces instructions.
Le cœur R600 comprend 64 clusters de shaders, tandis que les cœurs RV610 et RV630 ont respectivement 8 et 24 clusters de shaders.

### Tessellation matérielle

TeraScale comprend plusieurs unités capables d’effectuer des tessellations (en). Ceux-ci sont similaires aux unités programmables du GPU Xenos qui est utilisé dans la Xbox 360.
La tessellation a été officiellement spécifiée dans les principales API, à commencer par DirectX 11 et OpenGL 4. Les GPU basés sur TeraScale 1 (séries HD 2000, 3000 et 4000) ne sont conformes qu’à Direct3D 10 et OpenGL 3.3 et implémentent donc un principe de tessellation différent qui utilise des extensions d’API spécifiques au fournisseur. Les GPU basés sur TeraScale 2 (à partir de la série Radeon HD 5000) ont été les premiers à se conformer à la fois à la technique de tesselation Direct3D 11 et OpenGL 4.0. Bien que le tessellateur de TeraScale 1 soit de conception plus simple, il est décrit par AMD comme un sous-ensemble de la norme de tesselation ultérieure.
Les unités de tessellation de TeraScale permettent aux développeurs de prendre un maillage polygonal simple et de le subdiviser à l’aide d’une fonction d’évaluation de surface courbe. Il existe différentes formes de tessellation, telles que les surfaces de Bézier avec des N-patchs (en), des B-splines et des NURBS, ainsi que certaines techniques de subdivision de la surface, qui incluent généralement le displacement mapping d’une sorte de texture. Essentiellement, cela permet d’augmenter considérablement la densité de polygones d’un modèle simple à faible nombre de polygones en temps réel avec un impact très faible sur les performances. Scott Wasson de Tech Report a noté lors d’une démonstration d’AMD que le modèle résultant était si dense avec des millions de polygones qu’il semblait solide.
Le tessellateur de TeraScale rappelle ATI TruForm (en), le nom de marque d’une des premières unités de tessellation matérielle utilisées initialement dans la Radeon 8500.
ATI TruForm a reçu peu d’attention de la part des développeurs de logiciels. Quelques jeux (tels que Madden NFL 2004, Serious Sam, Unreal Tournament 2003 et 2004, et officieusement Morrowind), avaient le support de la technologie de tesselation d’ATI. Une adaptation aussi lente est liée au fait qu’il ne s’agissait pas d’une fonctionnalité partagée avec les GPU Nvidia, car ceux-ci avaient mis en œuvre une solution de tessellation concurrente utilisant des correctifs Quintic-RT qui avaient obtenu encore moins de soutien de la part des principaux développeurs de jeux. Étant donné que le GPU de la Xbox 360 est basé sur l’architecture d’ATI, Microsoft a considéré la tessellation de surface accélérée par le matériel comme une fonctionnalité majeure du GPU. Quelques années plus tard, la fonction de tesselation est devenue obligatoire avec la sortie de DirectX 11 en 2009$^,$.
Alors que le principe de tessellation introduit avec TeraScale ne faisait pas partie des exigences d’OpenGL 3.3 ou de Direct3D 10.0, et que des concurrents tels que la série GeForce 8 ne disposaient pas d’un matériel similaire, Microsoft a ajouté la fonction de tessellation dans le cadre de ses plans futurs pour DirectX 10.1. Enfin, Microsoft a introduit la tessellation en tant que fonctionnalité requise non pas avec DirectX 10.1 mais avec DirectX 11.
Le processeur géométrique de GCN est une solution plus récente d’AMD (qui a acquis l’activité GPU d’ATI) pour effectuer la tessellation à l’aide du GPU.

### Processeur de dispatching ultra-threadé

Bien que le GPU R600 soit un changement significatif par rapport aux conceptions précédentes, il partage toujours de nombreuses caractéristiques avec son prédécesseur, le 520. Le Ultra-Threaded Dispatch processor est un composant architectural majeur du cœur R600, tout comme il l’était avec les GPU Radeon X1000. Ce processeur gère un grand nombre de threads à la volée de trois types distincts (shader de vertex (sommets), de géométrie et de pixels) et bascule entre eux selon les besoins. Avec un grand nombre de threads gérés simultanément, il est possible de réorganiser l’ordre des threads pour utiliser les shaders de manière optimale. En d’autres termes, le processeur d’expédition évalue ce qui se passe dans les autres parties du R600 et tente de maintenir l’efficacité du traitement aussi élevée que possible. Il y a aussi des niveaux de gestion inférieurs ; chaque réseau SIMD de 80 processeurs de flux possède son propre séquenceur et son propre arbitre. L’arbitre décide du prochain thread à traiter, tandis que le séquenceur tente de réorganiser les instructions pour obtenir les meilleures performances possibles au sein de chaque thread.

### Texturation et anticrénelage

La texturation et la sortie finale du cœur du R600 sont similaires mais également distinctes de celles du R580. Le R600 est équipé de 4 unités de texture qui sont découplées (indépendantes) du cœur de shaders, comme dans les GPU R520 et R580. Les unités de sortie de rendu (ROP) de la série Radeon HD 2000 effectuent désormais la tâche d’anticrénelage multi-échantillons (MSAA) avec des grilles d’échantillonnage programmables et un maximum de 8 points d’échantillonnage, au lieu d’utiliser des shader de pixels comme dans la série de cartes graphiques Radeon X1000. Une autre nouveauté est la possibilité de filtrer les textures FP16, populaires avec l’éclairage HDR, à pleine vitesse. Le ROP peut également effectuer un filtrage trilinéaire et anisotrope sur tous les formats de texture. Sur le R600, cela donne 16 pixels par cycle d'horloge pour les textures FP16, tandis que les textures FP32 de plus grande précision sont filtrées à mi-vitesse (8 pixels par cycle d'horloge).
Les capacités d’anticrénelage sont plus robustes sur le R600 que sur la série R520. En plus de la possibilité d’effectuer un MSAA 8 ×, contre un MSAA 6 x du R300 au R580, le R600 dispose d’un nouveau mode d’anticrénelage à filtre personnalisé (custom filter anti-aliasing, CFAA). CFAA fait référence à une implémentation de filtres non-box qui examinent les pixels autour du pixel particulier en cours de traitement afin de calculer la couleur finale et d’anticréneler l’image. Le CFAA est effectué par les shaders, et non dans les ROP. Cela améliore considérablement la programmabilité, car les filtres peuvent être personnalisés, mais peut également entraîner des problèmes de performances potentiels en raison de l’utilisation de ressources de shader. À partir du lancement du R600, le CFAA utilise des filtres en forme de tente larges ou étroits. Dans ce cas, les échantillons provenant de l’extérieur du pixel en cours de traitement sont pondérés linéairement en fonction de leur distance par rapport au centroïde de ce pixel, la fonction linéaire étant ajustée en fonction du filtre large ou étroit choisi.

### Contrôleurs mémoire

Les contrôleurs mémoire sont connectés via un bus en anneau bidirectionnel interne disposé en périphérie du processeur. Dans la Radeon HD 2900, il s’agit d’un bus en anneau bidirectionnel de 1 024 bits (512 bits en lecture et 512 bits en écriture), avec 8 canaux mémoire de 64 bits pour une largeur de bus totale de 512 bits sur la 2900 XT. dans la Radeon HD 3800, il s’agit d’un bus en anneau de 512 bits ; dans les Radeon HD 2600 et HD 3600, il s’agit d’un bus en anneau de 256 bits ; sur les Radeon HD 2400 et HD 3400, il n’y a pas de bus annulaire.

### Mise à jour à mi-génération

La série a connu une mise à jour à mi-génération avec des variantes à précision de gravure améliorée (55 nm) : RV670, RV635 et RV620. Toutes les variantes prennent en charge PCI Express 2.0, DirectX 10.1 avec les fonctionnalités Shader Model 4.1, le décodeur vidéo unifié (en) (UVD) ATI dédié pour tous les modèles et la technologie PowerPlay (en) pour les cartes vidéo de bureau.
À l’exception de la série Radeon HD 3800, toutes les variantes prennent en charge deux sorties DisplayPort intégrées, prenant en charge les écrans 24 et 30 bits pour des résolutions allant jusqu’à 2 560×1 600. Chaque sortie comprend 1, 2 ou 4 voies, avec un débit de données allant jusqu’à 2,7 Gbit/s par voie.
ATI a affirmé que la prise en charge de DirectX 10.1 peut apporter des performances et une efficacité de traitement améliorées avec une erreur d'arrondi réduite (0,5 ULP par rapport à l'erreur moyenne de 1,0 ULP considérée comme erreur tolérable), de meilleurs détails et une meilleure qualité d’image, une illumination globale (une technique utilisée dans les films d’animation, et plus d’améliorations aux systèmes de jeu grand public, offrant ainsi une expérience de jeu plus réaliste).

### Cartes graphiques

* Radeon HD 2000
* Radeon HD 3000
* Radeon HD 4000

## TeraScale 2 (VLIW5)

TeraScale 2 (VLIW5) a été introduit avec les GPU Radeon HD 5000 de la génération « Evergreen ».
Lors du HPG10, Mark Fowler a présenté « Evergreen » et a déclaré que, par exemple, les cartes 5870 (Cypress), 5770 (Juniper) et 5670 (Redwood) prennent en charge une résolution maximale de 6 fois 2560×1600 pixels, tandis que la carte 5470 (Cedar) prend en charge 4 fois 2560×1600 pixels, ce qui est important pour la prise en charge multi-moniteurs AMD Eyefinity.
Avec la sortie de Cypress, l’architecture du moteur graphique Terascale a été mise à niveau avec deux fois plus de cœurs de flux, d’unités de texture et d’unités ROP par rapport au RV770. L’architecture des cœurs de flux est en grande partie inchangée, mais ajoute la prise en charge des fonctionnalités DirectX 11/DirectCompute (en) 11 avec de nouvelles instructions. De façon similaire au RV770, quatre unités de texture sont liées à 16 cœurs de flux (chacun a cinq unités de traitement, ce qui fait un total de 80 unités de traitement). Cette combinaison est appelée "coeur SIMD".
Contrairement à la Radeon R700 de son prédécesseur, comme DirectX 11 impose un contrôle total des développeurs sur l’interpolation, les interpolateurs dédiés ont été supprimés, s’appuyant plutôt sur les cœurs SIMD. Les coeurs de flux peuvent gérer l’instruction multiplication-addition fusionnée (FMA) de précision d’arrondi plus élevée en simple et double précision, ce qui augmente la précision par rapport à la multiplication-addition (MAD) et est conforme à la norme IEEE 754-2008. L'instruction somme des différences absolues (SAD) a été ajoutée nativement aux processeurs. Cette instruction peut être utilisée pour améliorer considérablement les performances de certains processus, tels que l’encodage vidéo et le transcodage sur le moteur 3D. Chaque coeur SIMD est équipé d’un partage de données local de 32 ko et de 8 ko de cache L1, tandis que tous les cœurs SIMD partagent un partage de données global de 64 ko.

### Contrôleur mémoire

Chaque contrôleur mémoire est relié à deux quadruples ROP, un par canal 64 bits, et à un cache L2 dédié de 512 ko.

### Économie d'énergie

AMD PowerPlay (en) est pris en charge.

### Puces

* Puces Evergreen :
** Cedar RV810
** Cypress RV870
** Hemlock R800
** Juniper RV840
** Redwood RV830
* Puces Northern Islands :
** Barts RV940
** Caicos RV910
** Turks RV930
* APU qui contiennent un IGP TeraScale 2 :
** Llano
** Ontario
** Zacate

## TeraScale 3 (VLIW4)

TeraScale 3 (VLIW4) remplace les conceptions VLIW à 5 voies précédentes par une conception VLIW à 4 voies. La nouvelle conception intègre également une unité de tessellation supplémentaire pour améliorer les performances de Direct3D 11.
TeraScale 3 est introduit dans les cartes graphiques Radeon HD 6900 et également implémenté dans les APU Trinity et Richland.

### Économie d'énergie

AMD PowerTune (en), l'ajustement dynamique de la fréquence pour les GPU, a été introduite avec la série Radeon HD 6900 le 15 décembre 2010 et a fait l’objet d’un développement continu, comme l’ont documenté certaines critiques d’AnandTech$^,$$^,$$^,$.

### Puces

* Puces Northern Islands :
** Cayman RV970
** Antilles R900
* APU qui contiennent un IGP TeraScale 3 :
** Trinity
** Richland