Ce qu’est un BAR, et pourquoi les GPU l’ont débordé

Chaque périphérique PCIe expose un ou plusieurs Base Address Registers. Un BAR dit au système combien d’espace d’adressage le périphérique veut, et le micrologiciel le mappe dans la carte mémoire de l’hôte. Une fois mappé, le CPU atteint la mémoire du périphérique avec des lectures et écritures ordinaires.

La taille d’un BAR était autrefois figée dans le silicium. Le micrologiciel la lisait à la mise sous tension et la conversation s’arrêtait là.

C’était bien tant que les BAR étaient petits. Une carte réseau veut quelques dizaines de kilo-octets pour ses registres. Un contrôleur NVMe veut de 16 à 64 Ko.

Les cartes graphiques ont cassé l’arrangement. Une carte moderne a 8, 12, 16 ou 24 Go de mémoire vidéo, et la chose évidente à faire est de tout mapper pour que le CPU puisse écrire n’importe où dedans. Les BAR figés ne pouvaient pas exprimer cela, donc la convention est devenue une petite fenêtre — d’ordinaire 256 Mo — que le pilote repointe sur le framebuffer, copiant à travers elle par morceaux. Ça marche. C’est juste une quantité stupide de gestion pour atteindre une mémoire que vous avez déjà achetée et montée.

Une ouverture fixe expose une tranche à la fois ; le Resizable BAR mappe le toutBAR fixe — une fenêtre de 256 Mo24 Go de VRAM, en tranchesla fenêtreLe pilote repointe la fenêtre et copie à travers,une tranche à la fois. Tranches illustratives, hors échelle.Resizable BAR — le toutles mêmes 24 Go, mappés une foisun seul BAR couvre toutLe CPU écrit là où il veut. Pas de fenêtreà déplacer.
L’ouverture de 256 Mo est moins une limite de bande passante qu’une taxe de gestion : le pilote passe son temps à déplacer la fenêtre au lieu de déplacer des données.

Ce que change le Resizable BAR

Le Resizable BAR est une capacité PCIe qui laisse négocier la taille d’un BAR au lieu de la figer. Le périphérique annonce les tailles qu’il peut prendre en charge, et le micrologiciel ou le système d’exploitation en programme une.

Pour un GPU, cela veut dire que tout le framebuffer peut être mappé d’un coup. Le pilote cesse de paginer à travers une fenêtre et écrit là où il veut écrire. Le noyau rapporte la capacité comme Physical Resizable BAR, et elle est neutre vis-à-vis du fabricant. Une carte AMD fonctionne avec sur une plateforme Intel et inversement.

Ce que font réellement les trois fabricants

La partie intéressante est que les fabricants ne s’accordent pas sur son importance.

Trois fabricants, une capacité, trois postures différentesIntel Arc / Arc ProREQUIS« Requis pour une bonneexpérience avec Arc »Coupé, les pics de frametime déjàprésents deviennent plus gros.Plateformes : Core 10e gén etplus récents, la plupart des Ryzen 3000,tous les Ryzen 5000.NVIDIAPROFIL PAR JEUÀ partir de la série RTX 30,mars 2021« Quelques pour cent, jusqu'à 12 % » —et certains titres ralentissent, doncle pilote ne l'active que là oùil s'est mesuré plus rapide.A demandé une màj VBIOS + SBIOS.AMD RadeonSMART ACCESS MEMORYMême capacité, venduesous un nom de marqueLancé avec RX 6000 etRyzen 5000 en fonction couplée,mais la capacité est du PCIestandard et marche inter-fabricants.Plus inégal sur Vega et Polaris.La capacité est identique dans les trois cas — ce qui diffère est si le fabricant la traite en prérequis,en optimisation à appliquer sélectivement, ou en fonction de produit.
Même capacité, trois postures différentes. Intel la traite en prérequis ; NVIDIA la livre allumée seulement pour les jeux qu’il a testés ; AMD la vend comme une fonction.

Intel Arc et Arc Pro — Intel le dit requis

Intel est le plus catégorique. Ses conseils disent que le Resizable BAR est « required to get a good experience with Intel® Arc™ hardware » — nécessaire pour obtenir une bonne expérience avec le matériel Intel Arc. C’est un langage exceptionnellement fort pour une fonction de plateforme, et cela montre comment le pilote Arc est bâti plutôt qu’un choix marketing.

Côté symptômes, Intel décrit l’effet de le couper en termes de régularité plutôt que de moyennes : avec « ReBAR off », cela « will generally result in spikes that were already there getting bigger » — les pics déjà présents deviennent plus gros. C’est un argument de stabilité de frametime, et c’est le même genre de problème que l’effet d’ASPM sur les queues de latence. La moyenne le cache.

Intel liste les processeurs Intel Core de 10e génération et plus récents, la plupart des Ryzen série 3000 et tous les CPU Ryzen 5000 comme plateformes prises en charge, et le traite comme une fonction du BIOS de la carte mère que vous devez aller activer.

La conséquence pratique pour Arc et Arc Pro est simple. Si vous avez mis une carte Arc dans une machine et que la performance est décevante ou inégale, vérifiez ceci avant de vérifier quoi que ce soit d’autre. À ce titre, ce n’est pas tant un bouton de réglage sur ces cartes qu’un prérequis.

NVIDIA — à partir d’Ampere, et seulement là où ça aide

NVIDIA a ajouté la prise en charge des cartes et portables GeForce RTX série 30 en mars 2021. Le faire marcher demandait un VBIOS pris en charge, un CPU et une carte mère compatibles, une mise à jour du micrologiciel de la carte mère, et un pilote à jour. La RTX 3060 est livrée avec ; les 3060 Ti, 3070, 3080 et 3090 pouvaient avoir besoin d’une mise à jour du micrologiciel pour l’obtenir.

Le cadrage de performance de NVIDIA est agréablement sans éclat. Ils ont trouvé que « some titles benefit from a few percent, up to 12% » — certains titres gagnent quelques pour cent, jusqu’à 12 % — tandis que « there are also titles that see a decrease in performance », il y a donc aussi des titres dont la performance baisse.

Leur réponse à cela est le détail à connaître : plutôt que de le laisser allumé globalement, NVIDIA pré-teste les titres et se sert de profils par jeu pour n’activer le Resizable BAR que là où il s’est mesuré comme un gain. Sur une carte NVIDIA, « ReBAR est-il activé ? » a donc une réponse par application, et un test qui ne montre rien peut simplement être un titre que le pilote a décidé de laisser tranquille.

AMD — Smart Access Memory, c’est la même chose

L’appellation d’AMD est Smart Access Memory, introduite en même temps que la série Radeon RX 6000 et les CPU Ryzen 5000. Le marketing laisse entendre un couplage CPU-AMD-plus-GPU-AMD, et c’est ainsi qu’il a été lancé, mais la capacité en dessous est la capacité PCIe standard. Activez le Resizable BAR dans le micrologiciel avec une carte Radeon dans une machine Intel et vous obtenez la même fonction sans l’appellation.

Les cartes Radeon Pro série W la prennent en charge aussi. Sur des architectures plus anciennes — Vega et Polaris — la prise en charge est plus inégale, et c’est aussi là que vit l’ennui de virtualisation.

Le Resizable BAR et le travail d’IA

C’est là que la fonction est mal comprise, alors il vaut d’être clair sur ce qu’elle touche.

Le Resizable BAR change la façon dont le CPU atteint la mémoire du GPU. C’est le chemin de transfert — préparer les poids d’un modèle, pousser des lots, relire les résultats. Il ne touche pas la bande passante mémoire propre au GPU, et il ne rend pas une multiplication de matrices plus rapide.

Le résumé honnête est donc qu’il affecte le chargement et l’alimentation d’un modèle, pas l’arithmétique. Pour un gros modèle, la copie hôte-vers-périphérique au moment du chargement est un coût réel, et un BAR pleine taille laisse le CPU écrire droit dans la mémoire du périphérique au lieu de faire la navette par un hublot de 256 Mo. Pour le régime établi d’une passe d’inférence — où les poids sont déjà résidents et le travail est borné par le calcul. N’attendez rien.

Trois précisions valent d’être connues.

Arc Pro pour l’IA hérite du verdict d’Intel. Si Intel dit que la carte a besoin du Resizable BAR pour une bonne expérience, cela vaut pour une carte qui fait tourner oneAPI ou PyTorch tout autant que pour une qui fait tourner un jeu. Les cartes Arc et Arc Pro qui font de l’inférence devraient l’avoir activé, point final.

Sur NVIDIA, le nombre que vous voulez est BAR1. BAR1 est la fenêtre visible par l’hôte sur la mémoire du périphérique, et c’est par elle que passent les allocations mappées sur l’hôte et le GPUDirect RDMA :

# How much device memory is actually host-visible
nvidia-smi -q | grep -A3 "BAR1 Memory Usage"

Une carte de centre de données est bâtie avec un grand BAR1 d’emblée. Sur une carte de bureau, le Resizable BAR est ce qui rend cette fenêtre grande plutôt que minuscule. Si vous faites du RDMA droit depuis une carte réseau vers la mémoire du GPU, ce n’est pas un luxe.

Ne confondez pas ceci avec l’exigence de ROCm. Les exigences système de ROCm d’AMD réclament des CPU prenant en charge les atomiques PCIe — « modern CPUs after the release of 1st generation AMD Zen CPU and Intel™ Haswell », les CPU modernes parus après le Zen de 1re génération d’AMD et le Haswell d’Intel — et ne disent rien sur le dimensionnement des BAR. Ce sont deux exigences de plateforme différentes qui vivent toutes deux dans le même menu du BIOS, et les gens les mélangent sans cesse. Vérifiez celle dont vous avez réellement besoin.

Le mode d’échec qui mord le plus fort les montages d’IA n’est pas la performance du tout, et il est traité plus bas : plusieurs GPU à grand BAR dans une machine peuvent épuiser l’espace d’adressage.

Ce qu’il faut pour que ça marche

Quatre choses, et elles sont toutes au niveau du micrologiciel :

  • Resizable BAR activé dans le micrologiciel de la carte mère. Souvent coupé par défaut.
  • Above 4G Decoding activé. Un BAR de 24 Go ne peut pas tenir sous la ligne des 4 Go, donc la plateforme doit accepter d’allouer de l’espace d’adressage au-dessus. Activez-le même sans GPU présent. Ça ne coûte rien.
  • Démarrage UEFI, avec CSM coupé. Le mode de compatibilité hérité et les grands BAR ne font pas bon ménage.
  • Micrologiciel et pilotes à jour, en particulier sur les cartes mères et cartes de la transition 2020–2021, où la prise en charge est arrivée par mise à jour plutôt qu’au lancement.
Un grand BAR ne tient qu'au-dessus de 4 Go, et l'ouverture de l'invité doit être assez grande pour le tenirOù un BAR redimensionné peut réellement vivreRAM système0trou MMIO 32 bits4 GBMMIO 64 bitshautGPU 0BAR 24 GoGPU 1 — 24 GBGPU 2 — 24 GBGPU 3 — 24 GBEncombré, et 4 Go de large en toutUn BAR de 24 Go ne va pas ici. Un de 256 Mo à peinecould.Utilisable seulement avec Above 4G DecodingUn réglage de micrologiciel. Coupé par défaut sur certaines cartes,et sans lui un grand BAR n'est jamais alloué du tout.Chaque carte a besoin de sa place iciQuatre cartes de 24 Go veulent 96 Go de MMIO 64 bits alloués,plus tout le reste sur le bus. Le micrologiciel de toutecarte grand public ne le fera pas.Le signe : bien avec deux cartes, une refuse des'initialiser avec quatre, et dmesg dit pas de place pour le BAR.Hors échelle : la région 64 bits est bien plus grande que les 4 Go en dessous, ce qui est plutôtl'intérêt.
Above 4G Decoding est ce qui rend la région haute utilisable tout court — et chaque carte a besoin de sa propre place là-haut, ce qui est là où les montages d’IA multi-GPU heurtent le mur.

Comment vérifier sous Linux

Que la carte ait la capacité, et quelles tailles elle offre :

# Substitute your card's address from lspci
lspci -vvs 0000:XX:00.0 | grep -A6 "Physical Resizable BAR"

Le noyau expose aussi cela dans sysfs, un fichier par BAR redimensionnable :

cat /sys/bus/pci/devices/0000:XX:00.0/resource1_resize

Cette valeur est un masque de bits des tailles prises en charge, pas une taille. Le bit 0 veut dire 1 Mo, le bit 1 veut dire 2 Mo, le bit 2 veut dire 4 Mo, et la taille pour un bit donné est 2 ^ (bit + 20). Ainsi 00000000000001c0 a les bits 6, 7 et 8 mis, ce qui veut dire que le BAR peut faire 64 Mo, 128 Mo ou 256 Mo.

Pour voir ce qui est réellement en vigueur, lisez les régions assignées :

lspci -vvs 0000:XX:00.0 | grep -i Region

Une carte qui tourne avec son framebuffer entier mappé montre une région correspondant à sa taille de VRAM plutôt qu’une de 256 Mo.

Redimensionner à la main

Vous pouvez écrire la position de bit vous-même :

# bit 7 -> 2 ^ (7 + 20) = 128MB
echo 7 > /sys/bus/pci/devices/0000:XX:00.0/resource1_resize

Les conditions attachées sont strictes, et valent d’être lues avant d’essayer sur une machine à laquelle vous tenez. Chaque pilote doit d’abord être détaché du périphérique. Les périphériques voisins sous le même pont parent peuvent avoir besoin d’un retrait logiciel. Sur un périphérique VGA, écrire une valeur de redimensionnement démonte les pilotes de console de bas niveau. Tout ce qui tient les fichiers sysfs resourceN ouverts doit lâcher prise.

La documentation du noyau est aussi crue sur le résultat : le succès n’est pas garanti. Le redimensionnement échoue s’il n’y a pas d’espace d’adressage où placer le BAR plus grand. Ce qui vous ramène droit à Above 4G Decoding.

Quand ça tourne mal

dmesg dit qu’il ne peut pas assigner le BAR. Des messages de la forme BAR 0: no space for [mem size ...] veulent dire que l’allocation a échoué, pas que la carte est défaillante. Above 4G Decoding est la première chose à vérifier.

Plusieurs GPU et l’un d’eux ne s’initialise pas. C’est l’échec du multi-GPU et des racks d’IA. Quatre cartes avec des BAR de 24 Go ont besoin de 96 Go d’espace MMIO 64 bits alloués, plus tout le reste, et le micrologiciel de toutes les cartes mères grand public ne le fera pas. Le symptôme est que la machine va bien avec deux cartes et s’écroule avec quatre.

La performance a baissé. Sur NVIDIA cela peut être la propre conclusion du pilote, vu qu’ils l’activent par titre justement parce que certaines charges régressent. Sur les autres, mesurez dans les deux sens plutôt que de supposer.

Rien n’a changé du tout. L’issue la plus probable pour une charge qui n’a jamais été bornée par la fenêtre du CPU sur la VRAM.

Passer un GPU à grand BAR à une VM

À signaler parce que cela surprend : un invité n’hérite pas de la carte mémoire de l’hôte. Le micrologiciel de la VM bâtit sa propre ouverture MMIO 64 bits, et le défaut d’OVMF est bien plus petit qu’un GPU moderne n’en a besoin, donc la carte soit échoue à s’initialiser, soit retombe sur un petit BAR. C’est un sujet Proxmox et QEMU plutôt qu’un sujet GPU, et il vit dans l’article sur la taxe IOMMU aux côtés des exigences de type de machine de Toujours utiliser Q35, pas i440fx.

Références