Les cartes graphiques/La hiérarchie mémoire d'un GPU

Un livre de Wikilivres.
Aller à la navigation Aller à la recherche

Dans ce chapitre, nous allons voir comment est organisée la mémoire d'un GPU, ou plutôt devrait-on dire les mémoires d'un GPU. Eh oui : un GPU contient beaucoup de mémoires différentes. La hiérarchie mémoire des GPUs est assez particulière, que ce soit au niveau des caches ou de la mémoire, parfois des registres. Un GPU contient évidemment une mémoire vidéo, de grande taille, capable de stocker textures, vertices, images et bien d'autres choses nécessaires pour un rendu 3D. On y trouve souvent des mémoires caches dédiées aux textures ou aux vertices, et les GPUs récents contiennent aussi des caches tout court. Mais sur les cartes graphiques récentes, les caches sont complétés par des Local Store, des mémoires RAM qui servent de cache, mais fonctionnent comme des mémoires RAM normales.

La mémoire vidéo[modifier | modifier le wikicode]

La mémoire vidéo est nécessaire pour stocker l'image à afficher à l'écran, mais aussi pour mémoriser temporairement des informations importantes. Dans le cas le plus simple, elle sert simplement de Framebuffer : elle stocke l'image à afficher à l'écran. Au fil du temps, elle s'est vu ajouter d'autres fonctions, comme stocker les textures et les sommets de l'image à calculer, ainsi que divers résultats temporaires.

La plupart des cartes graphiques sont des cartes graphiques branchées sur des connecteurs/ports de la carte mère. Ce sont des cartes graphiques dites dédiées, opposées à celles intégrées dans les processeurs modernes. Elles disposent de leur propre mémoire rien qu'à elles. Elles disposent actuellement de plusieurs gigas-octets de RAM, qu'elles peuvent utiliser à leur guise.

Mémoire vidéo des cartes graphiques dédiées.

Beaucoup d'ordinateurs modernes ont une carte graphique intégrée au processeur, appelée carte graphique intégrée, ou encore IGP (Integrated Graphic Processor). Et ces IGP utilisent une partie de la mémoire RAM de l'ordinateur comme mémoire vidéo. On parle alors de mémoire unifiée, sous-entendu que l'on a unifié la mémoire vidéo et la mémoire système (la RAM). Il en est de même sur certaines consoles, où la RAM est partagée entre le processeur et la carte vidéo. Là, la carte graphique n'est pas intégrée au processeur : les deux sont dans des circuits séparés, soudés sur la carte mère, qu'on peut facilement repérer à l’œil nu. Mais les deux composants se partagent la mémoire RAM, même s'ils sont séparés. C'est notamment le cas sur la Nintendo 64, pour ne citer qu'elle, et sur d'autres consoles de jeu anciennes.

Mémoire unifiée CPU-GPU.

Il existe quelques cartes graphiques hybrides, qui mélangent les deux solutions précédentes. Ce sont généralement des cartes graphiques dédiées, mais qui peuvent réserver une partie de la mémoire système suivant leurs besoins. Typiquement, elles utilisent leur mémoire vidéo, mais peuvent déborder sur la mémoire système si jamais celle-ci est pleine. Les anciennes cartes graphique pouvaient lire ou écrire directement dans la mémoire RAM, grâce à certaines fonctionnalités du bus AGP. Il en est de même pour certaines cartes graphiques bas de gamme, qui peuvent accéder à certaines portions de la mémoire RAM grâce à des technologies adaptées, comme le TurboCache de NVIDIA ou l'HyperMemory d'AMD. Les performances sont alors inférieures à celles obtenues avec une carte graphique équivalente mais avec plus de mémoire vidéo.

Le partage de la capacité mémoire[modifier | modifier le wikicode]

On pourrait croire qu'un IGP a un désavantage en termes de mémoire vidéo. Entre avoir 16 gigas de RAM pour le processeur et 4 gigas pour la carte graphique, et seulement 16 gigas pour les deux, le choix est vite fait. Ceci dit, cette comparaison se fait à quantité de RAM système égale, ce qui n'a pas le même prix. En clair, ce désavantage peut se compenser en ajoutant de la RAM à l'ordinateur, ce qui n'est pas forcément plus cher. La RAM vidéo a un prix, après tout. Et surtout, ces comparaisons sont quelque peu biaisées par la manière dont l'IGP utilise la mémoire vidéo.

Sur les ordinateurs, la quantité de mémoire vidéo disponible pour l'IGP est généralement réglable avec un réglage dans le BIOS. On peut ainsi choisir d'allouer 64, 128 ou 256 mégaoctets de mémoire pour la carte vidéo, sur un ordinateur avec 4 gigaoctets de RAM. L'interprétation de ce réglage varie grandement selon les cartes mères ou l'IGP. Pour certains, ce réglage implique que la RAM sélectionnée est réservée uniquement à la carte graphique, même si elle n'en utilise qu'une partie. Dans ce cas, les réglages disponibles sont généralement limités, et la RAM allouée à la carte graphique est petite. Les concepteurs de carte mère ne veulent pas qu'une trop quantité de RAM soit perdu et inutilisable pour les applications. Donc ils brident la carte vidéo et ne lui allouent que peu de RAM. Comparé à une carte graphique dédiée, la RAM disponible pour l'IGP est généralement moindre.

Heureusement, les IGP actuels sont plus souples, de même que les GPU des consoles de jeu à mémoire unifiée. Avec eux, une bonne partie de la RAM est utilisable pour les programmes si la carte graphique ne l'utilise pas. Les IGP modernes fournissent deux réglages : une quantité de RAM minimale, totalement dédiée à l'IGP, et une quantité de RAM maximale que l'IGP ne peut pas dépasser. Par exemple, il est possible de régler l'IGP de manière à ce qu'il ait 64 mégaoctets rien que pour lui, mais qu'il puisse avoir accès à maximum 1 gigaoctet si il en a besoin. Cela fait au total 960 mégaoctets (1024-64) qui peut être alloués au choix à la carte graphique ou au reste des programmes en cours d’exécution, selon les besoins. Dans ce cas, on doit mesurer les choses à quantité totale de RAM égale, c'est à dire en prenant en compte la somme RAM système + RAM vidéo. Sachant que les PC actuels ont souvent beaucoup de RAM système, plus que de mémoire vidéo, les choses tournent à l'avantage de la carte graphique dédiée. Il est possible d'allouer de grandes quantités de RAM à l'IGP, parfois la totalité de la mémoire système.

Pour résumer, une carte dédiée a une répartition entre mémoire système et mémoire vidéo qui est fixe, rigide. Elle demande de mettre beaucoup de mémoire vidéo sur la carte graphique, afin qu'elle en ait assez pour les jeux vidéo gourmands. Même chose pour les IGP anciens, où la mémoire vidéo était fixée dans le BIOS en mode tout ou rien. Mais sur les IGP modernes et les consoles de jeu, le partage entre mémoire vidéo et système est dynamique, adapté aux besoins du processeur et du GPU, et permet de répartir la mémoire selon les besoins. Certes, cette organisation est un défaut sur les PC avec peu de RAM qui n'en ont pas assez pour servir à la fois les programmes et l'IGP, mais elle marche très bien sur les PC avec beaucoup de RAM. Au final, la répartition statique des cartes dédiées et la répartition dynamique de la mémoire unifiée sont deux méthodes différentes, avec des avantages et des inconvénients variés, dont on ne peut pas dire laquelle est supérieure. Tout est une question de compromis.

Répartition de la mémoire entre RAM système et carte graphique

Mais n'allez pas croire que la mémoire unifiée est parfaite. Pour de nombreux joueurs de jeux vidéos ou pour les applications très gourmandes en rendu graphique, la mémoire unifiée est un jeu qui n'en vaut pas vraiment la chandelle, en raison des autres désavantages qui vont suivre.

La bande passante de la mémoire vidéo[modifier | modifier le wikicode]

Sur les cartes graphiques dédiées, la mémoire vidéo est très proche des mémoires RAM qu'on trouve sous forme de barrettes dans nos PC, à quelques différences près. Le point le plus important est que la mémoire vidéo d'une carte dédiée n'est pas présente sous la forme de barrettes de mémoire. À la place, les puces de mémoire sont soudées sur la puce. La conséquence est que l'on ne peut pas upgrader la RAM d'une carte vidéo. Ce serait sympathique, mais ne serait pas d'une grande utilité, car les jeux vidéos gourmands en mémoire vidéo sont aussi gourmands en puissance de calcul. Upgrader une carte graphique ne sert à rien si celle-ci ne permet pas de jouer à des jeux récents avec un framerate convenable.

Le fait que la mémoire est soudée simplifie la conception de la carte graphique, mais cela a des avantages au niveau électrique, qui permettent d'améliorer les performances. Niveau performances, la mémoire vidéo a des performances radicalement différentes de la RAM des PC. Elle a un temps d'accès très long, de plusieurs centaines de cycles d'horloge. Cela a des conséquences sur l'architecture de la carte graphique, notamment au niveau des processeurs de shaders, qui sont conçus pour gérer ces temps d'accès long, comme on l'a vu dans le précédent chapitre. Par contre, elle a un très grand débit, autrement dit une bande passante élevée, proche de la centaine de gigaoctets par secondes sur les cartes graphiques modernes. Pour rappel, la bande passante d'une mémoire dépend de deux paramètres : sa fréquence, et la largueur de son bus mémoire. Détaillons le dernier, qui explique en grande partie pourquoi la mémoire vidéo a un débit supérieur à la mémoire système.

Le bus mémoire est ce qui connecte la mémoire au reste de la carte graphique. La largueur de ce bus n'est autre que la quantité de données que celui-ci peut transmettre à chaque cycle d'horloge, le nombre de bits que l'on peut lire/écrire en un cycle d'horloge. Sur la RAM système, le bus est de 64 bits sur les mémoires DDR modernes, mais peut monter à 128 bits en utilisant des techniques comme le dual channel, voire en 192/256 bits avec des techniques de triple/quad channel qui sont rarement utilisées. Globalement, la configuration classique sur un PC moderne est 128 bits, avec quelques machines bas de gamme en 64 bits. Sur les cartes graphiques modernes, les bus de 128 bits ou moins sont utilisés sur les cartes graphiques de faible performance, le reste ayant plus. Beaucoup de cartes graphiques modernes ont un bus mémoire de 192, 256, 384, voire 512 bits. En clair, elles permettent de lire/écrire plus de données par cycle d'horloge qu'une RAM système, de 2 à 8 fois plus.

Le fait que le bus est plus large est lié au fait que les puces mémoires sont soudées. La mémoire vidéo des cartes dédiées est composée de pleins de puces mémoires accessibles en parallèle, ce qui permet de charger des blocs de plusieurs centaines d'octets en une seule fois. Les barrettes de mémoire ont des limites au nombres de broches que leur connecteur peut accepter, qui est proche de 300 pour les DDR actuelles (beaucoup de ces broches ne transfèrent pas des données, ce qui fait qu'on a bien 64 broches dédiées aux données seulement). Sans connecteurs, on est limité à ce que la puce du GPU peut accepter, et on est alors entre 4000 à 6000 broches sur les sockets de CPU ou de GPU actuels.

Puces mémoires d'un GPU et d'une barrette de mémoire.

Tout cela nous dit qu'avec une mémoire unifiée, la bande passante de la RAM est plus faible. On a dit plus haut que sur les cartes graphiques dédiées, la RAM a un débit proche de la centaine de gigaoctets par secondes. Avec une carte graphique intégrée, vous pouvez facilement diviser cette estimation par 10. De plus, le débit de la RAM est à partager entre la carte graphique et le processeur, ce qui réduit encore les performances. Et ce partage n'est pas chose facile. Les deux se marchent sur les pieds et entrent en conflit pour l'accès à la RAM. La carte graphique doit parfois attendre que le processeur lui laisser l'accès à la RAM et inversement. Divers circuits d'arbitrage s'occupent de répartir équitablement les accès à RAM entre les deux, mais cela ne permet que d'avoir un compromis imparfait qui peut réduire les performances. Le seul moyen pour réduire la casse est d'ajouter des mémoires caches entre le GPU et la RAM, le processeur ayant déjà beaucoup de caches lui-même. Mais l'efficacité des caches est relativement limitée pour le rendu 3D et ne donne pas des résultats vraiment spectaculaires.

Les échanges entre processeur et mémoire vidéo[modifier | modifier le wikicode]

Avec la mémoire unifié, les transferts entre processeur et carte graphique sont instantanés. Sans mémoire unifiée, il est souvent nécessaire de copier des données depuis la RAM vers la mémoire vidéo. Quand on charge un niveau de jeux vidéo, on doit notamment charger la scène, les textures, et d'autres choses dans la mémoire RAM, puis les copier dans la mémoire vidéo pour le rendu. Avec la mémoire unifiée, ces données sont chargées en RAM et n'ont pas besoin d'être copiée. La carte vidéo peut y accéder directement, en lisant leur position initiale en RAM.

Sur les cartes graphiques dédiées, les échanges entre processeur et carte graphique dédiée passent par l'intermédiaire de la mémoire vidéo. Les données sont copiées depuis la mémoire RAM vers la mémoire vidéo, en passant par le bus. Cette copie est effectuée par un circuit spécialisé : le contrôleur DMA, qui permet d'échanger des données entre mémoire vidéo et mémoire RAM sans devoir utiliser le processeur. Il est souvent intégré dans le contrôleur de bus de la carte graphique.

Les caches et local stores d'un GPU[modifier | modifier le wikicode]

Les cartes graphiques sont censées avoir peu de caches. Les caches en question sont des caches spécialisés pour les textures ou pour les sommets, ce qui leur vaut les noms de caches de texture et de cache de sommets. Il n'existe pas beaucoup d'autres caches sur les anciennes cartes graphiques, l'usage de caches plus complexes n'étant pas vraiment utile sur les cartes graphiques. Ce n'est que par la suite, quand les GPU commencèrent à être utilisés pour du calcul généraliste (scientifique, notamment), que la situation changea. Les GPU utilisèrent alors de plus en plus de caches généralistes. La hiérarchie mémoire des GPU ressemblent de plus en plus à celle des CPU, du moins pour les caches. On y trouve toute une hiérarchie de caches, avec des caches L1, L2, L3, etc.

En plus d'utiliser des caches, les processeurs de la carte graphique utilisent des local stores, des mémoires RAM intermédiaires entre la RAM principale et les caches/registres. Typiquement, chaque processeur de flux possède sa propre mémoire locale. Ces local stores peuvent être vus comme des caches, mais que le programmeur doit gérer manuellement. La faible capacité de ces mémoires, tout du moins comparé à la grande taille de la mémoire vidéo, les rend utile pour stocker temporairement des résultats de calcul "peu imposants". L'utilité principale est donc de réduire le trafic avec la mémoire centrale, les écritures de résultats temporaires étant redirigés vers les local stores.

Local stores d'un GPU.