# Graphics Core Next

Graphics Core Next (GCN) est le nom d'une série de microarchitectures et d'un jeu d'instructions, développés par AMD pour leurs GPU. GCN succède à TeraScale.
GCN est une microarchitecture RISC SIMD, contrastant avec l'architecture VLIW SIMD de TeraScale. GCN nécessite beaucoup plus de transistors que TeraScale, mais offre des avantages pour les calculs sur GPU à usage général (GPGPU) grâce à un compilateur plus simple.
Les puces graphiques GCN ont été fabriquées en CMOS à 28 nm et en FinFET à 14 nm (par Samsung Electronics et GlobalFoundries) et en 7 nm (par TSMC), et sont disponibles sur certains modèles de cartes graphiques AMD Radeon HD 7000, HD 8000 (en), 200, 300, 400, 500 et RX Vega, y compris la Radeon VII sortie séparément. GCN a également été utilisée dans la partie graphique des unités de traitement accéléré (APU), y compris celles de la PlayStation 4 et de la Xbox One.

## Microarchitectures

En date de juillet 2017, le jeu d’instructions de Graphics Core Next a connu cinq itérations. Les différences entre les quatre premières générations sont plutôt minimes, mais l’architecture GCN de cinquième génération comporte des processeurs de flux fortement modifiés pour améliorer les performances et prendre en charge le traitement simultané de deux nombres de précision inférieure au lieu d’un seul nombre de plus haute précision.

### Traitement des commandes graphiques
#### Processeur de commandes graphiques

Le processeur de commandes graphiques (GCP, Graphics Command Processor) est une unité fonctionnelle de la microarchitecture GCN. Il est notamment responsable de la gestion des shaders asynchrones.

#### Moteur de calcul asynchrone

Le moteur de calcul asynchrone (ACE, Asynchronous Compute Engine) est un bloc fonctionnel distinct servant à des fins informatiques, dont l’objectif est similaire à celui du processeur de commandes graphiques.

#### Ordonnanceurs

Depuis la troisième itération de GCN, le matériel contient deux ordonnanceurs : l’un pour planifier les « fronts d’onde » pendant l’exécution du shader (le CU Scheduler, ou Compute Unit Scheduler) et l’autre pour planifier l’exécution des files d’attente de dessin et de calcul. Ce dernier améliore les performances en exécutant des opérations de calcul lorsque les unités de calcul (CU) sont sous-utilisées en raison de commandes graphiques limitées par la vitesse ou la bande passante du pipeline à fonction fixe. Cette fonctionnalité est connue sous le nom de calcul asynchrone.
Pour un shader donné, les pilotes GPU peuvent également programmer des instructions sur le CPU afin de minimiser la latence.

### Processeur de géométrie

Un processeur de géométrie contient un assembleur de géométrie, un Tesselateur et un assembleur de sommets.
Le Tesselateur est capable de faire de la tessellation matérielle telle que définie par Direct3D 11 et OpenGL 4.5, et a succédé à ATI TruForm (en) et à la tessellation matérielle dans TeraScale.

### Unités de calcul

Une unité de calcul (CU) combine 64 processeurs de shader avec 4 unités de mappage de texture (TMU)$^,$. Les unités de calcul sont séparées des unités de sortie de rendu (ROP), mais les alimentent. Chaque unité de calcul se compose des éléments suivants :
* un ordonnanceur de CU
* une unité de branchement et de messages
* 4 unités vectorielles SIMD de 16 voies de large (SIMD-VU)
* 4 fichiers VGPR (Vector General-Purpose Register) de 64 ko
* 1 unité scalaire (SU)
* un fichier GPR scalaire de 8 ko
* un fichier de partage de données local de 64 Ko
* 4 unités de filtrage de texture
* 16 unités de récupération-chargement/stockage de texture
* un cache de niveau 1 (L1) de 16 ko
Quatre unités de calcul sont câblées pour partager un cache d’instructions L1 de 16 ko et un cache de données L1 de 32 ko, tous deux en lecture seule. Un SIMD-VU traite 16 éléments à la fois (par cycle), tandis qu’un SU traite un seul élément à la fois (un/cycle). De plus, le SU gère d’autres opérations, telles que le branchement.
Chaque SIMD-VU dispose d’une mémoire privée où il stocke ses registres. Il existe deux types de registres : les registres scalaires (S0, S1, etc.), qui contiennent chacun un nombre de 4 octets, et les registres vectoriels (V0, V1, etc.), qui représentent chacun un ensemble de 64 nombres de 4 octets. Sur les registres vectoriels, chaque opération se fait en parallèle sur les 64 nombres, ce qui correspond à 64 entrées. Par exemple, il peut fonctionner sur 64 pixels différents à la fois.
Chaque SIMD-VU possède 512 registres scalaires et 256 registres vectoriels.
AMD indique que chaque unité de calcul (CU) de GCN dispose d’un fichier de partage de données local (LDS) de 64 ko.

#### Ordonnanceur de CU

L’ordonnanceur de CU est le bloc fonctionnel matériel qui choisit les fronts d’onde exécutés par le SIMD-VU. Il sélectionne un SIMD-VU par cycle pour l'ordonnancement. Il ne doit pas être confondu avec d’autres ordonnanceurs matériels ou logiciels.

#### « Front d'onde »

Un shader est un petit programme écrit en GLSL qui effectue un traitement graphique, et un noyau de calcul (en) est un petit programme écrit en OpenCL qui effectue un traitement GPGPU. Ces processus n’ont pas besoin de tellement de registres, mais ils ont besoin de charger des données à partir de la mémoire système ou graphique. Cette opération s’accompagne d’une latence importante. AMD et Nvidia ont choisi des approches similaires pour masquer cette latence inévitable : le regroupement de plusieurs threads. AMD appelle un tel groupe un « front d'onde », tandis que Nvidia l’appelle un « warp ». Un groupe de threads est l’unité de planification la plus élémentaire des GPU qui implémentent cette approche pour masquer la latence. Il s’agit de la taille minimale des données traitées à la manière SIMD, de la plus petite unité de code exécutable et de la façon de traiter une seule instruction sur tous les threads qu’elle contient en même temps.
Dans tous les GPU GCN, un « front d'onde » se compose de 64 threads, et dans tous les GPU Nvidia, un « warp » se compose de 32 threads.
La solution retenue par AMD est d’attribuer plusieurs fronts d'onde à chaque SIMD-VU. Le matériel distribue les registres aux différents fronts d’onde, et lorsqu’un front d’onde attend un résultat qui se trouve en mémoire, l'ordonnanceur de CU attribue au SIMD-VU un autre front d’onde. Les fronts d’onde sont attribués par SIMD-VU. Les SIMD-VU n’échangent pas de front d’onde. Un maximum de 10 fronts d’onde peuvent être attribués par SIMD-VU (donc 40 par CU).
AMD CodeXL (en) affiche des tableaux avec la relation entre le nombre de SGPR et de VGPR par rapport au nombre de fronts d’onde, mais essentiellement, pour SGPRS, il est compris entre 104 et 512 par nombre de fronts d’onde, et pour VGPRS, il est de 256 par nombre de fronts d’onde.
On notera qu’en conjonction avec les instructions SSE, ce concept du niveau le plus élémentaire de parallélisme est souvent appelé une « largeur de vecteur ». La largeur du vecteur est caractérisée par le nombre total de bits qu’elle contient.

#### Unité vectorielle SIMD

Chaque unité vectorielle SIMD possède :
* une unité arithmétique et logique (ALU) vectorielle à 16 voies entier et virgule flottante
* Un fichier VGPR (Vector General Purpose Register) de 64 ko
* 10× compteurs de programme 48 bits
* Un tampon d’instructions pour 10 fronts d'onde (chaque front d’onde est un groupe de 64 threads, soit la taille d’un VGPR logique)
* un front d’onde de 64 threads parcourt une unité SIMD à 16 voies en quatre cycles.
Chaque SIMD-VU dispose de 10 tampons d’instructions de front d’onde, et il faut 4 cycles pour exécuter un front d’onde.

### Blocs d’accélération audio et vidéo

De nombreuses implémentations de GCN sont généralement accompagnées de plusieurs autres blocs ASIC d’AMD. Y compris, mais sans s’y limiter, Unified Video Decoder (en) (UVD, décodeur vidéo unifié), le Video Coding Engine (en) (VCE, moteur de codage vidéo) et TrueAudio (en).

#### Moteur de codage vidéo

Le moteur de codage vidéo est un ASIC d’encodage vidéo, introduit pour la première fois avec la série Radeon HD 7000.
La version initiale de VCE a ajouté la prise en charge de l’encodage des trames I et P de H.264 au format de pixels YUV420, ainsi que l’encodage temporel SVE et le mode d’encodage d’affichage, tandis que la deuxième version a ajouté la prise en charge des trames B pour les trames I YUV420 et YUV444.
VCE 3.0 faisait partie de la troisième génération de GCN, ajoutant une mise à l’échelle vidéo de haute qualité et le codec HEVC (H.265).
VCE 4.0 faisait partie de l’architecture Vega, et a ensuite été remplacé par Video Core Next (en).

### Mémoire virtuelle unifiée

Dans un article paru en 2011, AnandTech a présenté la mémoire virtuelle unifiée prise en charge par Graphics Core Next.
* Architecture classique d’ordinateur de bureau avec une carte graphique distincte sur PCI Express. Le CPU et le GPU ont leur propre mémoire physique, avec des espaces d’adressage différents. L’ensemble des données doit être copié sur le bus PCIe.
* Architecture classique d’ordinateur de bureau avec une carte graphique distincte sur PCI Express. Le CPU et le GPU ont leur propre mémoire physique, avec des espaces d’adressage différents. L’ensemble des données doit être copié sur le bus PCIe.
* GCN prend en charge la « mémoire virtuelle unifiée », permettant ainsi la copie zéro (en), au lieu des données, seuls les pointeurs sont copiés, « passés ». Il s’agit d’une caractéristique primordiale de HSA (en).
* GCN prend en charge la « mémoire virtuelle unifiée », permettant ainsi la copie zéro (en), au lieu des données, seuls les pointeurs sont copiés, « passés ». Il s’agit d’une caractéristique primordiale de HSA (en).
* Les solutions graphiques intégrées (et les APU AMD avec carte graphique TeraScale) souffrent d’une mémoire principale partitionnée : une partie de la mémoire système est allouée exclusivement au GPU. La copie zéro n’est pas possible, les données doivent être copiées (sur le bus de mémoire système) d’une partition à l’autre.
* Les solutions graphiques intégrées (et les APU AMD avec carte graphique TeraScale) souffrent d’une mémoire principale partitionnée : une partie de la mémoire système est allouée exclusivement au GPU. La copie zéro n’est pas possible, les données doivent être copiées (sur le bus de mémoire système) d’une partition à l’autre.
* Les APU AMD avec carte graphique GCN bénéficient d’une "mémoire principale unifiée", ce qui permet d’économiser une bande passante limitée.
* Les APU AMD avec carte graphique GCN bénéficient d’une "mémoire principale unifiée", ce qui permet d’économiser une bande passante limitée.

## Générations
### Graphics Core Next 1

La microarchitecture GCN 1 a été utilisée dans plusieurs cartes graphiques de la famille Radeon HD 7000.
* prise en charge de l’adressage 64 bits (espace d’adressage x86-64) avec espace d’adressage unifié pour le CPU et le GPU
** Le GPU envoie des demandes d’interruption au CPU sur divers événements (tels que les erreurs de page)
* prise en charge de PCIe 3.0
* prise en charge des textures partiellement résidentes, qui permettent la prise en charge de la mémoire virtuelle via les extensions DirectX et OpenGL
* Prise en charge de PowerTune (en), qui ajuste dynamiquement les performances pour rester dans les limites d’un TDP spécifique
* prise en charge de l'interface de programmation Mantle (en)
Des moteurs de calcul asynchrones contrôlent le calcul et la répartition de la charge$^,$.

#### ZeroCore Power

ZeroCore Power est une technologie d’économie d’énergie à long terme, qui éteint les unités fonctionnelles du GPU lorsqu’elles ne sont pas utilisées. La technologie AMD ZeroCore Power complète PowerTune (en).

#### Puces

GPU discrets (famille Southern Islands) :
* Hainan
* Oland
* Cap-Vert
* Pitcairn
* Tahiti

### Graphics Core Next 2

La 2e génération de GCN a été introduite avec la Radeon HD 7790 et se trouve également dans les Radeon HD 8770, R7 260/260X, R9 290/290X, R9 295X2, R7 360 et R9 390/390X, ainsi que dans les APU pour PC de bureau « Kaveri » et pour PC portables « Kaveri » basés sur Steamroller ainsi que dans les APU « Beema » et « Mullins » basés sur Puma. Elle présente plusieurs améliorations par rapport au GCN d’origine, notamment la prise en charge de FreeSync, TrueAudio (en) et une version révisée de la technologie PowerTune (en).
La 2e génération de GCN a introduit une entité appelée « Shader Engine » (SE, moteur de shader). Un moteur de shader comprend un processeur de géométrie, jusqu’à 44 « Compute Units » (CU, unités de calcul) (puce Hawaï), des rastériseurs, des ROP et un cache L1. Le processeur de commandes graphiques, les 8 ACE (Asynchronous Compute Engine), les contrôleurs de cache L2 et de mémoire ainsi que les accélérateurs audio et vidéo, les contrôleurs d’affichage, les 2 contrôleurs DMA et l’interface PCIe ne font pas partie d’un moteur de shader.
L’A10-7850K « Kaveri » contient 8 CU (unités de calcul) et 8 ACE (moteurs de calcul asynchrones) pour une planification indépendante et une répartition des éléments de travail.
Lors de l’AMD Developer Summit (APU) en novembre 2013, Michael Mantor a présenté la Radeon R9 290X .

#### Puces

GPU discrets (famille Sea Islands) :
* Bonaire
* Hawaï
Intégrées dans les APU :
* Temash
* Kabini
* Liverpool (l’APU que l’on trouve dans la PlayStation 4)
* Durango (l’APU que l’on trouve dans la Xbox One et la Xbox One S)
* Kaveri
* Godavari
* Mullins
* Beema
* Carrizo-L

### Graphics Core Next 3

La 3e génération GCN a été introduite en 2014 avec les Radeon R9 285 et R9 M295X, équipés du GPU « Tonga ». Elle offre des performances de tessellation améliorées, une compression des couleurs delta sans perte pour réduire l’utilisation de la bande passante mémoire, un jeu d’instructions mis à jour et plus efficace, un nouveau scaler de haute qualité pour la vidéo, l’encodage HEVC (VCE 3.0) et le décodage HEVC (UVD 6.0), ainsi qu’un nouveau moteur multimédia (encodeur/décodeur vidéo). La compression des couleurs delta est prise en charge dans Mesa. Cependant, ses performances en double précision sont moins bonnes que celles de la génération précédente.

#### Puces

GPU discrets :
* Tonga (famille Volcanic Islands), livré avec UVD (en) 5.0
* Fidji (famille Pirate Islands), livré avec UVD 6.0 et High Bandwidth Memory (HBM 1)
intégrées dans les APU :
* Carrizo, livré avec UVD 6.0
* Bristol Ridge
* Stoney Ridge

### Graphics Core Next 4

Les GPU de la famille Arctic Islands ont été introduits au deuxième trimestre 2016 avec la série Radeon Rx 400. Le moteur 3D (c’est-à-dire le GCA (Graphics and Compute array) ou GFX) est identique à celui que l’on trouve dans les puces Tonga, mais Polaris dispose d’un moteur de contrôleur d’affichage plus récent, UVD version 6.3, etc.
Toutes les puces basées sur Polaris autres que la Polaris 30 sont produites selon le procédé FinFET 14 nm, développé par Samsung Electronics et concédé sous licence à GlobalFoundries. Le Polaris 30, légèrement plus récent, est construit sur le nœud de procédé FinFET LP 12 nm, développé par Samsung et GlobalFoundries. L’architecture du jeu d’instructions GCN de quatrième génération est compatible avec la troisième génération. Il s’agit d’une optimisation pour le procédé FinFET 14 nm permettant des fréquences d’horloge GPU plus élevées qu’avec la 3e génération GCN. Les améliorations architecturales comprennent de nouveaux planificateurs matériels, un nouvel accélérateur de rejet de primitive, un nouveau contrôleur d’affichage et un UVD mis à jour qui peut décoder HEVC à des résolutions 4K à 60 images par seconde avec 10 bits par canal de couleur.

#### Puces

GPU discrets :
* Polaris 10 (également nom de code Ellesmere) que l’on trouve sur les cartes graphiques de marque « Radeon RX 470 » et « Radeon RX 480 »
* Polaris 11 (également nom de code Baffin) que l’on trouve sur les cartes graphiques de marque « Radeon RX 460 » (également Radeon RX 560D)
* Polaris 12 (également nom de code Lexa) que l’on trouve sur les cartes graphiques de marque « Radeon RX 550 » et « Radeon RX 540 »
* Polaris 20, qui est un Polaris 10 rafraîchi (procédé FinFET 14 nm LPP Samsung/GloFo) avec des fréquences d'horloge plus élevées, utilisé pour les cartes graphiques de marque « Radeon RX 570 » et « Radeon RX 580 ».
* Polaris 21, qui est un Polaris 11 rafraîchi (procédé FinFET 14 nm LPP Samsung/GloFo), utilisé pour les cartes graphiques de marque « Radeon RX 560 »
* Polaris 22, que l’on trouve sur les cartes graphiques de marque « Radeon RX Vega M GH » et « Radeon RX Vega M GL » (dans le cadre de Kaby Lake-G)
* Polaris 23, qui est un Polaris 12 rafraîchi (procédé FinFET 14 nm LPP Samsung/GloFo), utilisé pour les cartes graphiques de marque « Radeon Pro WX 3200 » et « Radeon RX 540X » (également Radeon RX 640)
* Polaris 30, qui est un Polaris 20 rafraîchi (procédé FinFET 12 nm LP GloFo ) avec des fréquences d'horloge plus élevées, utilisé pour les cartes graphiques de marque « Radeon RX 590 ».
En plus des GPU dédiés, Polaris est utilisé dans les APU de la PlayStation 4 Pro et de la Xbox One X, intitulés respectivement « Neo » et « Scorpio ».

## Graphics Core Next 5

AMD a commencé à publier les détails de sa prochaine génération d’architecture GCN, appelée « unité de calcul de nouvelle génération », en janvier 2017$^,$$^,$. On s’attendait à ce que la nouvelle conception augmente le nombre d’instructions par cycle (IPC), des fréquences d’horloge plus élevées, la prise en charge de HBM2, un espace d'adressage mémoire plus grand. Les chipsets graphiques discrets incluent également « HBCC (High Bandwidth Cache Controller) », mais pas lorsqu’ils sont intégrés dans des APU. De plus, les nouvelles puces devaient inclure des améliorations dans les unités de sortie de rastérisation et de rendu. Les processeurs de flux sont fortement modifiés par rapport aux générations précédentes pour prendre en charge la technologie mathématique Rapid Pack Math pour les nombres 8 bits, 16 bits et 32 bits. Cela permet d’obtenir un avantage significatif en termes de performances lorsqu’une précision inférieure est acceptable (par exemple, le traitement de deux nombres en demi-précision à la même vitesse qu’un seul nombre en simple précision).
Nvidia a introduit la rastérisation basée sur les tuiles et le binning avec Maxwell, et c'est une importante raison de l’augmentation de l’efficacité de Maxwell. En janvier, AnandTech a supposé que Vega rattraperait enfin Nvidia en ce qui concerne les optimisations de l’efficacité énergétique grâce au nouveau « DSBR (Draw Stream Binning Rasterizer) » qui sera introduit avec Vega.
Il a également ajouté la prise en charge d’une nouvel étage de shader - les shaders de primitive$^,$. Les shaders de primitive offrent un traitement de géométrie plus flexible et remplacent les shaders de vertex et de géométrie dans un pipeline de rendu. En décembre 2018, les shaders de primitive ne pouvaient pas être utilisés, car les modifications d’API requises n’avaient pas encore été effectuées.
Vega 10 et Vega 12 utilisent le procédé FinFET 14 nm, développé par Samsung Electronics et concédé sous licence à GlobalFoundries. Vega 20 utilise le procédé FinFET 7 nm développé par TSMC.

### Puces

GPU discrets :
* Vega 10 (procédé FinFET 14 nm Samsung/GloFo) (également nom de code Groenland) trouvé sur les cartes graphiques « Radeon RX Vega 64 », « Radeon RX Vega 56 », « Radeon Vega Frontier Edition », « Radeon Pro V340 », Radeon Pro WX 9100 et Radeon Pro WX 8200,
* Vega 12 (procédé FinFET 14 nm Samsung/GloFo) que l’on trouve sur les cartes graphiques pour PC portables de marque « Radeon Pro Vega 20 » et « Radeon Pro Vega 16 »
* Vega 20 (procédé FinFET 7 nm TSMC) que l’on trouve sur les cartes d’accélération de marque « Radeon Instinct MI50 » et « Radeon Instinct MI60 », « Radeon Pro Vega II » et les cartes graphiques de marque « Radeon VII ».
intégrées dans les APU :
* Raven Ridge est livré avec VCN 1 qui remplace VCE et UVD et permet un décodage à fonction fixe complet de VP9.

### Performances de calcul en fonction de la précision

Les performances en virgule flottante double précision (FP64) de tous les GPU GCN de 5e génération, à l’exception de Vega 20, représentent un seizième des performances en FP32. Pour Vega 20 avec Radeon Instinct, c’est la moitié des performances en FP32. Pour Vega 20 avec Radeon VII, c’est un quart des performances en FP32. Tous les GPU GCN de 5e génération prennent en charge les calculs en virgule flottante demi-précision (FP16), avec deux fois plus de performances qu'en FP32.