Chapitre 1 : Introduction à la conception de puces GPU
Qu'est-ce que les GPU et en quoi diffèrent-ils des CPU ?
Les unités de traitement graphique (GPU) sont des circuits électroniques spécialisés conçus pour manipuler et modifier rapidement la mémoire afin d'accélérer la création d'images dans un tampon d'images destiné à être affiché sur un périphérique d'affichage. Les GPU ont été initialement développés pour décharger le CPU du rendu 2D et 3D, permettant ainsi de meilleures performances pour les applications gourmandes en graphiques comme les jeux vidéo.
Tandis que les CPU sont conçus pour le calcul à usage général et disposent d'une logique de contrôle complexe pour prendre en charge une grande variété de programmes, les GPU ont une architecture hautement parallèle composée de milliers de cœurs plus petits et plus efficaces, conçus pour gérer plusieurs tâches simultanément. Cela les rend idéaux pour le rendu graphique, où de grands blocs de données peuvent être traités en parallèle.
Les principales différences architecturales entre les CPU et les GPU incluent :
- Nombre de cœurs : les GPU ont un grand nombre de petits cœurs (centaines à milliers), tandis que les CPU ont quelques cœurs larges et puissants (2-64).
- Hiérarchie du cache : les CPU ont de grands caches pour réduire la latence, tandis que les GPU ont des caches plus petits et s'appuient davantage sur une bande passante élevée pour compenser la latence.
- Logique de contrôle : les CPU ont des capacités de prédiction de branchement et d'exécution hors d'ordre complexes. Les GPU ont une logique de contrôle beaucoup plus simple.
- Jeu d'instructions : les CPU prennent en charge une grande variété d'instructions pour le calcul à usage général. Les jeux d'instructions GPU sont plus limités et optimisés pour les graphiques.
- Bande passante mémoire : les GPU ont une très haute bande passante mémoire (jusqu'à 1 To/s) pour alimenter leurs nombreux cœurs. Les CPU ont une bande passante plus faible (50-100 Go/s).
- Performances en virgule flottante : les GPU sont capables de performances en virgule flottante beaucoup plus élevées, les rendant adaptés aux charges de travail HPC et IA.
En résumé, l'architecture hautement parallèle des GPU leur permet d'exceller dans les tâches impliquant le traitement de grands blocs de données en parallèle, tandis que la logique de contrôle plus sophistiquée des CPU les rend plus adaptés au calcul à usage général.Voici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :
Principales applications et importance des GPU
Au cours des deux dernières décennies, les GPU sont devenus l'un des types de technologie de calcul les plus importants, car leur structure hautement parallèle les rend plus efficaces que les processeurs généraux (CPU) pour les algorithmes qui traitent de grands blocs de données en parallèle. Certains des principaux domaines d'application qui ont stimulé l'avancement rapide de la technologie des GPU incluent :
Graphiques informatiques et jeux
L'utilisation la plus courante des GPU est d'accélérer la création d'images dans un tampon d'image destiné à être affiché sur un périphérique d'affichage. Les GPU excellent dans la manipulation des graphiques informatiques et le traitement d'images, et leur structure hautement parallèle les rend plus efficaces que les processeurs généraux (CPU) pour les algorithmes où de grands blocs de données sont traités en parallèle. Ils sont un composant standard dans les consoles de jeux modernes et les PC de jeux.
Calcul haute performance (HPC)
Les capacités de traitement parallèle des GPU les rendent bien adaptés aux applications de calcul scientifique qui impliquent le traitement de très grands ensembles de données avec des algorithmes parallèles. Les GPU ont été largement adoptés dans les supercalculateurs et les grappes HPC, où ils travaillent aux côtés des processeurs (CPU) pour accélérer les charges de travail hautement parallèles comme la prévision météorologique, les simulations de dynamique moléculaire et l'analyse sismique.
Intelligence artificielle et apprentissage automatique
La puissance de traitement parallèle des GPU a été essentielle dans l'avancement rapide de l'apprentissage profond et de l'IA ces dernières années. L'entraînement de réseaux de neurones profonds complexes nécessite une énorme quantité de puissance de calcul, et les GPU sont devenus la plateforme de choix pour l'entraînement de modèles d'IA à grande échelle en raison de leur capacité à effectuer efficacement les opérations de multiplication de matrices au cœur des algorithmes d'apprentissage profond. Toutes les principales plateformes cloud d'IA et les supercalculateurs utilisés pour l'IA reposent sur les GPU.Voici la traduction française du fichier Markdown :
Minage de cryptomonnaies
Les GPU ont également été largement utilisés pour le minage de cryptomonnaies, car leurs capacités de traitement parallèle les rendent bien adaptés aux algorithmes de hachage cryptographique utilisés dans les cryptomonnaies basées sur la preuve de travail comme Bitcoin. Les GPU haut de gamme d'AMD et de Nvidia ont été très fortement demandés pendant le boom des cryptomonnaies de 2017.
Calcul accéléré et IA de périphérie
Avec le ralentissement de la loi de Moore, il y a eu une tendance majeure vers le calcul accéléré et hétérogène, avec des puces accélératrices spécialisées comme les GPU travaillant aux côtés des CPU pour accélérer les charges de travail exigeantes. Les GPU sont également utilisés pour apporter des capacités d'IA aux appareils de périphérie comme les smartphones, les enceintes intelligentes et les systèmes automobiles. Les SoC mobiles intègrent désormais couramment des GPU intégrés qui sont utilisés à la fois pour la graphique et pour accélérer les charges de travail d'IA.
Le parallélisme massif et la bande passante mémoire élevée des GPU en ont fait l'une des plateformes de calcul les plus importantes aujourd'hui, avec des applications bien au-delà de la graphique informatique. Alors que nous atteignons les limites des processeurs à usage général, les puces spécialisées comme les GPU, les FPGA et les accélérateurs d'IA deviennent des moteurs de calcul de plus en plus importants pour l'avenir.
Le paysage des accélérateurs de calcul
Alors que les améliorations de performances des CPU à usage général ont ralenti ces dernières années, il y a eu une tendance croissante vers les puces accélératrices spécialisées qui peuvent accélérer des charges de travail spécifiques. Les GPU sont l'un des exemples les plus importants d'accélérateurs, mais il existe plusieurs autres catégories importantes :
Réseaux de portes programmables (FPGA)
Les FPGA sont des dispositifs à semi-conducteurs basés sur une matrice de blocs logiques configurables (CLB) connectés via des interconnexions programmables. Les FPGA peuvent être reprogrammés pour répondre aux exigences d'application ou de fonctionnalité souhaitées après la fabrication, offrant une alternative plus flexible aux ASIC. Ils sont couramment utilisés dans l'aérospatiale et la défense, le prototypage d'ASIC, l'imagerie médicaleVoici la traduction française du fichier markdown :
Circuits intégrés spécifiques à une application (ASIC)
Les ASIC sont des circuits intégrés personnalisés pour une utilisation particulière, plutôt que destinés à un usage général comme les processeurs. Les ASIC modernes incluent souvent des processeurs 32 bits ou 64 bits, des blocs de mémoire incluant ROM, RAM, EEPROM, mémoire flash et d'autres grands blocs de construction. Les ASIC sont couramment utilisés dans l'extraction de bitcoins, les accélérateurs d'IA, la communication sans fil 5G et les appareils IdO.
Accélérateurs d'IA
Les accélérateurs d'IA sont des puces spécialisées conçues pour accélérer les charges de travail d'IA, en particulier l'entraînement et l'inférence des réseaux de neurones. Parmi les exemples, on peut citer les unités de traitement des tenseurs (TPU) de Google, les processeurs de réseaux de neurones Nervana (NNP) d'Intel et un certain nombre de startups construisant des puces d'IA à partir de zéro. Ces puces exploitent les mathématiques de précision réduite, des circuits de multiplication de matrices efficaces et une intégration étroite du calcul et de la mémoire pour atteindre des performances par watt beaucoup plus élevées que les GPU ou les processeurs sur les charges de travail d'IA.
Unités de traitement de la vision (VPU)
Les VPU sont des puces spécialisées conçues pour accélérer les charges de travail de vision par ordinateur et de traitement d'images. Elles incluent souvent du matériel dédié pour des tâches comme le traitement du signal d'image, la vision stéréoscopique et la détection d'objets basée sur les CNN. Les VPU sont couramment utilisés dans des applications telles que les systèmes avancés d'aide à la conduite automobile, les drones, les casques de réalité augmentée/virtuelle, les caméras intelligentes et d'autres appareils Edge nécessitant un traitement visuel à faible latence.
Puces neuromorphiques et quantiques
À plus long terme, les puces neuromorphiques tentent d'imiter l'architecture du cerveau pour offrir des performances de réseau de neurones rapides et économes en énergie, tandis que les puces quantiques exploitent les effets mécaniques quantiques pour résoudre certains problèmes plus rapidement que les ordinateurs classiques. Il s'agit encore de domaines de recherche émergents, mais ils pourraient devenir des accélérateurs importants à l'avenir.
La tendance générale en informatique est vers des architectures spécifiques aux domaines et une diversité d'accélérateurs intégrés aux côtés des processeurs généralistes pour accélérer les charges de travail spécifiques.Voici la traduction française du fichier Markdown, avec les commentaires traduits mais le code non traduit :
Charges de travail importantes. Les GPU ont été les pionniers de ce modèle de calcul accéléré et restent l'un des types d'accélérateurs les plus importants, mais une grande variété d'autres accélérateurs deviennent également de plus en plus essentiels dans de nombreux domaines d'application.
Principes de base du matériel GPU
Un GPU moderne est composé de plusieurs composants matériels clés :
Multiprocesseurs de flux (SM)
Le SM est le bloc de construction de base de l'architecture GPU NVIDIA. Chaque SM contient un ensemble de cœurs CUDA (généralement de 64 à 128) qui partagent la logique de contrôle et le cache d'instructions. Chaque cœur CUDA a une unité arithmétique et logique (ALU) et une unité de calcul en virgule flottante (FPU) entièrement pipelinées. Généralement, une puce GPU compte de 16 à 128 SM, ce qui donne des milliers de cœurs CUDA.
Cache de texture/L1
Chaque SM dispose d'un cache de texture dédié et d'un cache L1 pour améliorer les performances et réduire le trafic mémoire. Le cache de texture est conçu pour optimiser la localité spatiale et est particulièrement efficace pour les charges de travail graphiques. Le cache L1 gère les opérations mémoire (lecture, écriture) et fournit un accès rapide aux données avec une latence faible.
Mémoire partagée
La mémoire partagée est une mémoire rapide, sur puce, qui est partagée entre les cœurs CUDA au sein d'un SM. Elle peut être utilisée comme un cache programmable, permettant un accès à bande passante plus élevée et à latence plus faible aux données fréquemment réutilisées. La mémoire partagée est divisée en modules de mémoire (banques) de taille égale qui peuvent être accessibles simultanément par les cœurs.
Registre
Chaque SM dispose d'un grand registre qui fournit un stockage à faible latence pour les opérandes. Le registre est divisé entre les threads résidents sur un SM, fournissant à chaque thread son propre ensemble de registres dédié. L'accès à un registre prend généralement zéro cycle d'horloge supplémentaire par instruction, mais des retards peuvent se produire en raison des dépendances de lecture-après-écriture de registre et des conflits de banque de mémoire de registre.
Ordonnanceur de warps
L'ordonnanceur de warps est responsable de la gestion et de l'ordonnancement des warps sur un SM. Un warp est un groupe de 32 threads qui s'exécutent de manière concurrente sur les cœurs CUDA.Voici la traduction française du fichier Markdown :
Le planificateur de warps sélectionne les warps prêts à s'exécuter et les envoie aux cœurs, permettant une utilisation élevée et une dissimulation de la latence.
Réseau d'interconnexion
Le réseau d'interconnexion relie les SMs au cache L2 partagé et aux contrôleurs mémoire du GPU. Il est généralement mis en œuvre sous la forme d'un commutateur en croix qui permet à plusieurs SMs d'accéder au cache L2 et à la DRAM simultanément.
Contrôleurs mémoire
Les contrôleurs mémoire gèrent toutes les demandes de lecture et d'écriture vers la DRAM du GPU. Ils sont chargés d'optimiser les schémas d'accès à la DRAM pour maximiser l'utilisation de la bande passante. Les GPU modernes ont des interfaces DRAM très larges (de 256 bits à 4096 bits) et prennent en charge des technologies mémoire à haute bande passante comme GDDR6 et HBM2.
Cœurs RT et Cœurs Tensor
Les GPU NVIDIA modernes incluent également des unités matérielles spécialisées pour accélérer le lancer de rayons (Cœurs RT) et l'IA/l'apprentissage profond (Cœurs Tensor). Les Cœurs RT accélèrent la traversée de la hiérarchie des volumes englobants (BVH) et les tests d'intersection rayon-triangle, tandis que les Cœurs Tensor offrent une multiplication de matrices et des opérations de convolution à très haut débit.
Ces composants matériels travaillent ensemble pour permettre aux GPU d'atteindre un débit de calcul et une bande passante mémoire très élevés, les rendant bien adaptés aux charges de travail parallèles en graphisme, HPC et IA. L'architecture hautement parallèle et les unités matérielles spécialisées des GPU modernes leur permettent d'offrir des performances bien supérieures aux processeurs généraux dans certaines charges de travail.
Bref historique des GPU
L'histoire des GPU peut être retracée jusqu'aux débuts de l'accélération des graphiques 3D dans les années 1990 :
-
Années 1990 : Les premiers accélérateurs 3D comme 3dfx Voodoo et NVIDIA RIVA TNT sont apparus au milieu des années 1990 pour décharger le rendu des graphiques 3D du CPU. Il s'agissait de dispositifs à fonction fixe optimisés pour un ensemble spécifique d'API graphiques et manquaient de programmabilité.
-
1999 : NVIDIA a introduit le GeForce 256, le premier GPU à mettre en œuvre la transformation et l'éclairage matériels (T&L) en plus du rendu 3D standard.Voici la traduction française du fichier markdown :
-
2001 : NVIDIA a lancé la GeForce 3, qui a introduit le shading de sommets et de pixels programmable, ouvrant la voie à des effets visuels plus réalistes et dynamiques. Cela a marqué le début de la transition des pipelines graphiques à fonction fixe vers des pipelines programmables.
-
2006 : La sortie de la GeForce 8800 GTX de NVIDIA a marqué un tournant majeur, car c'était le premier GPU à prendre en charge le modèle de programmation CUDA, permettant aux développeurs d'utiliser le GPU pour le calcul général (GPGPU) au-delà de la simple graphique. Il comportait 128 cœurs CUDA et pouvait atteindre plus de 500 GFLOPS de performance.
-
2008 : Apple, AMD, Intel et NVIDIA ont formé le groupe de travail OpenCL pour développer une norme ouverte pour la programmation parallèle sur des systèmes hétérogènes. OpenCL a fourni une alternative indépendante du fournisseur à CUDA, bien que CUDA soit resté la plateforme GPGPU la plus largement utilisée.
-
2010 : NVIDIA a lancé l'architecture Fermi, qui comportait jusqu'à 512 cœurs CUDA, une hiérarchie de cache L1/L2 unifiée, la prise en charge de la mémoire ECC et de meilleures performances en double précision. Cela a rendu les GPU viables pour un plus large éventail d'applications de calcul haute performance et scientifique.
-
2016 : NVIDIA a introduit l'architecture Pascal avec le Tesla P100, qui présentait une mémoire HBM2 à bande passante élevée, jusqu'à 3584 cœurs CUDA et des cœurs FP16 spécialisés pour l'apprentissage en profondeur. Le P100 pouvait délivrer plus de 10 TFLOPS de performance, consolidant les GPU comme la plateforme de choix pour l'entraînement de l'IA.
-
2018 : NVIDIA a lancé l'architecture Turing, qui a introduit les RT Cores pour le ray tracing en temps réel et les Tensor Cores pour l'accélération de l'inférence de l'IA. Turing a marqué une étape importante dans l'architecture des GPU, car elle a élargi les capacités du GPU au-delà du simple rasterisation et GPGPU pour inclure des techniques de rendu avancées et l'accélération de l'IA.
Conclusion
Au cours des deux dernières décennies, les GPU sont passés d'accélérateurs graphiques à fonction fixe à des accélérateurs hautement programmables, offrant des performances et des capacités de calcul impressionnantes.Voici la traduction française du fichier markdown :
Les processeurs graphiques (GPU) sont des moteurs de calcul écoénergétiques qui jouent un rôle essentiel dans un large éventail d'applications, du jeu et de la visualisation au calcul haute performance et à l'intelligence artificielle. Les principales innovations architecturales qui ont permis cette transformation incluent :
- L'introduction du shading programmable avec prise en charge des branchements et des boucles
- Des architectures de shaders unifiées qui permettent d'utiliser les mêmes unités de traitement pour différentes tâches de shading
- L'ajout de la prise en charge de modèles de programmation à usage général comme CUDA et OpenCL
- Une efficacité énergétique accrue grâce à une utilisation intensive du multithreading pour masquer la latence mémoire et maintenir l'utilisation des unités arithmétiques
- Des améliorations continues de la bande passante mémoire et l'introduction de technologies mémoire à haute bande passante comme GDDR6 et HBM2
- L'incorporation d'unités à fonction fixe pour le lancer de rayons et le traitement tensoriel afin d'accélérer le rendu et les charges de travail d'IA
En regardant vers l'avenir, il est clair que la spécialisation et le calcul hétérogène continueront à être des moteurs clés pour améliorer les performances et l'efficacité. Les GPU sont bien placés pour rester à l'avant-garde de ces tendances, compte tenu de leur héritage de traitement parallèle écoénergétique et de leur capacité à intégrer des fonctionnalités spécifiques à un domaine tout en maintenant une programmabilité à usage général. Des techniques comme les conceptions basées sur les puces et les technologies d'emballage avancées permettront aux GPU d'évoluer vers des niveaux de performance encore plus élevés et d'intégrer encore plus de fonctionnalités au fil du temps.
Dans le même temps, l'applicabilité de l'accélération GPU continue de croître, car de plus en plus de charges de travail dans le calcul scientifique, l'analyse de données et l'apprentissage automatique présentent le type de parallélisme à grain fin dans lequel les GPU excellent. Avec leur capacité à accélérer ces applications émergentes et d'autres, les GPU sont bien placés pour jouer un rôle de plus en plus important dans les futurs progrès de l'informatique. Comprendre leur architecture est essentiel pour exploiter tout leur potentiel.