Largeur du bus mémoire (128/256/384 bits) : quand cela compte vraiment

Cet article vous a aidé ?

Vous avez acheté « la GPU la plus rapide » et les chiffres restent têtus. Les FPS ne montent pas, le débit d’entraînement ne bouge pas, et votre
tableau de bord de perf ressemble à une ligne plate avec un sourire moqueur. Quelqu’un dit « ce n’est que du 128 bits », quelqu’un d’autre dit « la largeur du bus, c’est du marketing »,
et soudainement une réunion d’achats se transforme en cours de géométrie.

La largeur du bus mémoire compte — mais pas de la manière dont la plupart des gens s’en disputent. En production, elle compte quand vous êtes limité par la bande passante,
quand le cache ne peut pas vous sauver, et quand votre jeu de travail se comporte comme un raton laveur dans un garde-manger : partout, en pagaille et impossible à prévoir.

Ce que signifie réellement « bus 128/256/384 bits »

La largeur du bus mémoire est la largeur de l’interface entre les contrôleurs mémoire du GPU et la VRAM.
Un « bus 256 bits » signifie que le GPU peut transférer 256 bits par tick d’horloge mémoire par transfert à travers cette interface, agrégés sur les canaux.
En pratique, c’est implémenté comme plusieurs canaux mémoire (par exemple, 8 canaux × 32 bits chacun = 256 bits au total).

Ce chiffre n’a rien de mystique. C’est un budget de brochage et de surface de silicium. Des bus plus larges impliquent plus de broches, plus de traces, plus de consommation, plus de complexité.
Les fabricants ne mettent donc pas des bus larges par générosité. Ils le font parce que certaines charges sont voraces, et les charges voraces abandonnent les benchmarks.

L’astuce : la largeur du bus seule ne vous dit pas la bande passante. La bande passante est la largeur du bus multipliée par la fréquence de données mémoire (et ajustée pour le signal DDR),
moins les overheads, plus la magie noire du cache et de la compression.

Aussi : largeur du bus ≠ largeur PCIe. Les gens confondent constamment. PCIe est le lien entre le CPU et le GPU. La largeur du bus VRAM est à l’intérieur du package GPU.
Les mélanger, c’est comme blâmer l’ascenseur parce que votre robinet de cuisine coule lentement.

La largeur du bus est un plafond, pas une promesse

Un bus 384 bits vous donne le potentiel d’une bande passante maximale plus élevée. Ça ne garantit pas que votre charge l’obtiendra. Le débit réel dépend de :

  • La fréquence mémoire et le type (GDDR6, GDDR6X, HBM2e/HBM3, variantes LPDDR pour mobile)
  • Le motif d’accès (lectures/écritures coalescées vs dispersées)
  • Le taux de cache et les politiques de cache
  • L’efficacité et l’ordonnancement du contrôleur mémoire
  • La compression et les schémas de tiling (surtout en graphisme)
  • Les charges concurrentes qui se battent sur la même DRAM

Les calculs de bande passante que les gens zappent

Si vous ne pouvez pas calculer la bande passante théorique dans votre tête, vous continuerez à perdre des arguments face aux voix les plus fortes.
Voici la formule de base que vous utiliserez :

Bande passante théorique (GB/s) ≈ (largeur du bus (bits) ÷ 8) × débit de données mémoire (Gb/s par pin)

Le « débit de données » est généralement le taux effectif annoncé (par ex. 14 Gb/s, 19,5 Gb/s, 21 Gb/s). GDDR est un signal double data rate ; le chiffre en Gb/s reflète généralement déjà cela.

Exemples de calculs que vous devriez pouvoir faire au tableau

  • Bus 256 bits, GDDR6 à 14 Gb/s :
    (256/8) × 14 = 32 × 14 = 448 GB/s
  • Bus 128 bits, GDDR6 à 18 Gb/s :
    (128/8) × 18 = 16 × 18 = 288 GB/s
  • Bus 384 bits, GDDR6X à 21 Gb/s :
    (384/8) × 21 = 48 × 21 = 1008 GB/s

Où les gens se font piéger

Deux GPU peuvent avoir la même largeur de bus et une bande passante très différente parce que la vitesse mémoire diffère.
À l’inverse, un bus plus étroit avec une mémoire plus rapide peut battre un bus plus large avec une mémoire plus lente.
Et puis il y a le cache et la compression : le GPU peut parfois éviter d’aller en VRAM du tout, ce qui fait paraître la « largeur du bus » sans importance… jusqu’à ce qu’elle le soit.

Si vous achetez du matériel en vous basant uniquement sur la largeur du bus, vous magasinez avec une seule spécification. Ce n’est pas de l’ingénierie ; c’est de l’astrologie avec des tableaux.

Quand la largeur du bus importe (et quand ce n’est pas le cas)

Elle importe quand vous êtes limité par la bande passante

Être « bandwidth-bound » signifie que votre kernel/frame/pass de rendu est limité par la rapidité avec laquelle les données peuvent être déplacées vers/depuis la VRAM, et non par la rapidité des opérations arithmétiques.
Vous observez un fort débit DRAM, une utilisation de compute médiocre, et une performance qui évolue avec la bande passante mémoire plutôt qu’avec la fréquence ou le nombre de cœurs.

Indices révélateurs :

  • La performance s’améliore beaucoup quand vous réduisez la résolution/la taille des textures/la taille de lot/longueur de séquence
  • La performance s’améliore quand vous augmentez la compression de précision (en graphisme) ou utilisez des types plus petits (en ML) sans augmenter le compute
  • Les profileurs montrent un fort « DRAM read/write throughput » ou « pipeline mémoire occupé » tandis que les SM/units de compute ne sont pas saturés

Elle importe davantage à haute résolution et pour de grands jeux de travail

Le jeu en 1080p avec des textures modestes peut s’en moquer. Le 4K avec textures lourdes et ray tracing ? Là, vous transférez plus de données par image : G-buffer,
données BVH, textures, tampons de débruitage, passes de post-traitement. Si ces données débordent le cache, la bande passante VRAM devient un mur dur.

Elle importe quand vous ne pouvez pas « cacher » le problème

De grands caches de dernier niveau (et des politiques de cache intelligentes) peuvent masquer un bus étroit pour de nombreux jeux réels et certains patterns d’inférence ML.
Mais dès que le jeu de travail dépasse le cache et que vous avez des accès en streaming (pensez : gros tenseurs, grosses textures, structures clairsemées),
la largeur du bus et la vitesse mémoire se rappellent à vous avec la subtilité d’un huissier à 3 h du matin.

Elle importe moins quand vous êtes limité par le compute

Les charges compute-bound saturent les ALU/Tensor cores/SMs. Ici, la mémoire n’est pas le facteur limitant. Un bus plus large n’aidera pas beaucoup.
Exemples courants :

  • Multiplication matricielle dense où l’intensité arithmétique est élevée et la réutilisation de données forte (surtout avec tiling)
  • Certaines charges de ray tracing qui bouchonnent sur la traversée/le compute plutôt que la mémoire, selon la scène
  • Kernels d’entraînement FP16/BF16 bien optimisés qui atteignent le débit des Tensor cores et réutilisent fortement les entrées

Elle importe moins quand vous êtes limité par PCIe ou le CPU

Si votre pipeline cale sur le prétraitement côté CPU, l’I/O, le dataloader ou les transferts hôte → device, la largeur du bus VRAM est sans importance.
Vous pouvez avoir un bus 384 bits et vous ennuyer en attendant le CPU qui décode les images.

Une citation que je reviens souvent en ops : « La mesure est la première étape qui mène au contrôle. »
Quand les gens débattent de la largeur du bus sans mesurer, ils choisissent l’ambiance plutôt que le contrôle.

Caches, compression et autres façons dont les fabricants « trichent » avec la physique

Les gros caches multiplient l’effet d’un bus — jusqu’à un certain point

Les GPU modernes ont développé des caches L2 substantiels, et certaines architectures ajoutent même de plus grands caches de dernier niveau (parfois sous d’autres marques).
Quand votre charge tape dans le cache, les demandes de bande passante VRAM chutent fortement. Un bus plus étroit peut alors sembler « suffisant » parce que vous l’utilisez peu.

Mode d’échec : vous mettez à jour un jeu, changez de modèle, augmentez la taille du lot, ou ajoutez une fonctionnalité qui augmente le jeu de travail.
Le taux de hits cache s’effondre, et soudain le bus étroit devient toute votre personnalité.

La compression mémoire est réelle — et dépend de la charge

Les GPU compressent souvent les buffers de couleur, la profondeur et d’autres surfaces. Cela augmente effectivement la bande passante utile en déplaçant moins de bits.
Ce n’est pas magique ; c’est de la gestion de l’entropie. Les données hautement compressibles en bénéficient ; les données bruitées non.

C’est pourquoi deux jeux à la même résolution peuvent se comporter différemment sur le même GPU : leurs pipelines de rendu produisent des caractéristiques de données différentes.

La largeur du bus concurrence la puissance et le coût

Bus plus large : plus de puces mémoire (ou des puces de plus haute densité), plus de complexité PCB, plus de consommation.
Dans les laptops et systèmes compacts, un bus plus étroit est parfois un compromis délibéré pour maîtriser la thermique et le coût.
Se plaindre de cela, c’est comme se plaindre que votre vélo n’a pas un V8.

Blague n°1 : Un bus mémoire plus large ne résoudra pas votre micro-variations d’affichage si la compilation des shaders saccade — même s’il rendra la saccade plus rapide.

Patrons de charge : jeux, ML, rendu, analytique

Jeux : la largeur du bus se manifeste comme la « taxe 4K » et la « taxe textures »

Dans les jeux, le GPU touche beaucoup de mémoire à chaque frame : textures, buffers de vertex/index, targets de rendu, shadow maps, structures d’accélération ray tracing,
plus le post-traitement. À des résolutions plus élevées, vous augmentez la taille des targets de rendu et des buffers intermédiaires. La qualité des textures augmente aussi le trafic VRAM.

Où les bus étroits peinent :

  • 4K avec textures en haute qualité et post-traitement lourd
  • Ray tracing + haute résolution + débruitage
  • Scènes open-world avec forte pression de streaming (beaucoup d’actifs qui entrent/sortent)

Où la largeur du bus peut peu importer :

  • 1080p/1440p avec réglages modérés
  • Jeux esports limités par le CPU ou légers en textures
  • Scénarios où le GPU est limité par le compute du shading plutôt que par le trafic mémoire

Entraînement ML : « bandwidth-bound » dépend du mélange de couches

Les charges d’entraînement varient. Certaines couches sont compute-intensives avec forte réutilisation (matmul/projections d’attention), d’autres sont mémoire-intensives (layernorm, softmax,
recherches d’embeddings, certaines étapes d’optimiseur).

La largeur du bus a tendance à importer davantage quand :

  • Vous utilisez de petites tailles de lot et ne pouvez pas amortir les overheads ; vous avez moins de réutilisation par lancement
  • Vous faites beaucoup d’opérations limitées par la mémoire (normalisation, élémentaires, réductions) par rapport aux gros matmuls
  • Vous entraînez des modèles avec de grands embeddings ou des composants clairsemés
  • Vous n’utilisez pas de kernels fusionnés et vous renvoyez des tenseurs en VRAM entre de petites opérations

Elle importe moins quand :

  • Votre entraînement est dominé par de grands GEMM/conv où les tensor cores sont chauds et la réutilisation de données est élevée
  • Vous avez fusionné les opérations et augmenté l’intensité arithmétique

Inférence ML : la latence peut être sensible à la bande passante là où on s’y attend le moins

L’inférence fonctionne souvent avec de petits lots. Cela réduit la réutilisation de données et augmente la probabilité d’être limité par la mémoire sur le cache d’attention,
les lectures KV cache, et les layernorms. C’est pourquoi les GPUs grand public plus étroits peuvent paraître corrects à batch=16 mais s’effondrer sur des cibles de latence batch=1.

Rendu/compute (offline) : les grands jeux de données punissent les bus étroits

Les renderers offline, simulations et charges scientifiques traitent souvent de grands tableaux en accès streaming : lire un grand buffer, faire peu de compute,
écrire les résultats. C’est le cas type bandwidth-bound. Si vous faites cela, la largeur du bus et la bande passante mémoire sont souvent en haut de la liste des priorités.

Analytique sur GPU : scatter/gather est l’épreuve de vérité pour la largeur du bus

Les analyses de graphes, les jointures et les charges irrégulières créent des accès mémoire dispersés. Le cache et la coalescence aident, mais il y a une limite.
Dans ces cas, vous voulez à la fois de la bande passante et des fonctionnalités du sous-système mémoire qui gèrent bien la latence.

Faits intéressants et contexte historique (8 points rapides)

  1. Les bus larges étaient autrefois la victoire la plus facile. Les anciens GPU gagnaient beaucoup simplement en augmentant la largeur du bus quand les vitesses mémoire suivaient peu le compute.
  2. 256 bits est devenu un standard « sérieux » pendant des années. Il a équilibré complexité PCB et bande passante pour les cartes grand public haut de gamme longtemps.
  3. HBM a changé la conversation. Avec des interfaces très larges et un fort débit par package, HBM a déplacé le focus de « largeur du bus » vers « bande passante du stack mémoire ».
  4. Les tailles de cache ont explosé. Les architectures modernes ont adopté de grands caches L2/LLC-like pour réduire les allers-retours en VRAM et rendre les bus plus étroits plus viables.
  5. La compression est une spécification silencieuse. Les fabricants en parlent rarement aussi fort que la largeur du bus, mais la compression décide souvent des besoins de bande passante en conditions réelles.
  6. GDDR6X a poussé le signal plus loin. Des débits par pin plus élevés peuvent compenser des bus plus étroits, au prix de la puissance et de la complexité.
  7. Les contraintes mobiles ont forcé la créativité. Les limites de puissance et d’emballage dans les laptops ont favorisé des bus plus étroits associés à de la mise en cache et une gestion mémoire agressive.
  8. La largeur du bus façonne aussi les options de capacité VRAM. Le nombre de canaux et l’organisation des puces peuvent limiter des capacités « propres » sans configurations inhabituelles.

Playbook de diagnostic rapide

Voici l’ordre que j’utilise quand quelqu’un dit « nous avons besoin d’un bus plus large » ou « ce GPU est lent ». Vous essayez de répondre à une question :
La bande passante VRAM est-elle vraiment le goulot d’étranglement ?

1) Confirmez le matériel que vous avez réellement

  • Modèle GPU, type de mémoire, horloges, limites de puissance
  • Version du pilote et réglages de persistance
  • Êtes-vous sur iGPU/dGPU par erreur ? (Ça arrive. Souvent.)

2) Déterminez si la charge est compute-bound, bandwidth-bound, ou autre

  • Vérifiez l’utilisation GPU, les horloges, la consommation, les compteurs de débit mémoire si disponibles
  • Vérifiez l’utilisation CPU et les blocages I/O
  • Vérifiez le volume de transferts hôte→device et la vitesse du lien PCIe

3) Lancez un microbenchmark pour estimer la bande passante mémoire atteignable

  • Si le microbench atteint un fort débit DRAM mais que votre appli non : le problème est le motif d’accès, la fusion de kernels, ou le mouvement de données
  • Si le microbench est bien en dessous de l’attendu : vous pouvez être en throttling de puissance/horloge, mal configuré, ou sur une plateforme contrainte

4) Changez un seul réglage pour isoler la bande passante

  • Réduisez la résolution / taille du tenseur / taille de lot
  • Désactivez une fonctionnalité connue pour augmenter le trafic mémoire (ex. RT, textures haute-résolution, passes supplémentaires)
  • Observez l’échelle : quand c’est bandwidth-bound, la performance évolue souvent à peu près linéairement avec les octets déplacés

5) Parlez de la largeur du bus seulement ensuite

Si vous ne savez pas si vous êtes bandwidth-bound, parler de la largeur du bus n’est qu’une histoire que vous vous racontez pour vous sentir décisif.

Tâches pratiques : commandes, sorties, ce que cela signifie, ce que vous décidez

Ce sont les vérifications « faites-le maintenant » que j’attends d’un SRE on-call ou d’un ingénieur performance avant d’escalader vers un changement matériel.
Les commandes supposent Linux. Si vous êtes sur Windows, les concepts sont les mêmes ; votre journée est juste plus graphique.

Task 1: Identify the GPU and driver

cr0x@server:~$ nvidia-smi
Tue Jan 21 12:04:02 2026
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 555.42.02    Driver Version: 555.42.02    CUDA Version: 12.5     |
|-------------------------------+----------------------+----------------------|
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA RTX A5000    Off  | 00000000:65:00.0 Off |                  N/A |
| 30%   62C    P2   160W / 230W |  18123MiB / 24576MiB |     92%      Default |
+-------------------------------+----------------------+----------------------+

Signification de la sortie : Confirme le modèle GPU, le pilote, la limite de puissance, l’usage VRAM, l’utilisation GPU.

Décision : Si GPU-Util est bas mais que le job est lent, arrêtez de discuter de la largeur du bus et cherchez des blocages CPU/I/O/PCIe ou un mauvais batching.

Task 2: Verify PCIe link width and speed (host-device bottleneck check)

cr0x@server:~$ nvidia-smi -q | sed -n '/PCIe/,/FB Memory Usage/p'
    PCIe
        PCIe Generation
            Current                         : 4
            Max                             : 4
        Link Width
            Current                         : 8x
            Max                             : 16x
    FB Memory Usage
        Total                               : 24576 MiB
        Reserved                            : 500 MiB
        Used                                : 18123 MiB
        Free                                : 5953 MiB

Signification de la sortie : Le GPU fonctionne en PCIe Gen4 x8 même s’il supporte x16.

Décision : Si vous streamez des données fréquemment (services d’inférence, gros lots d’entrée), corrigez le placement du slot/bifurcation avant d’acheter un GPU à bus plus large.

Task 3: Confirm CPU model and memory bandwidth context

cr0x@server:~$ lscpu | egrep 'Model name|Socket|NUMA|CPU\(s\)'
CPU(s):                               64
On-line CPU(s) list:                  0-63
Model name:                           AMD EPYC 7543 32-Core Processor
Socket(s):                            2
NUMA node(s):                         2

Signification de la sortie : Vous êtes sur un système dual-socket NUMA ; la localité mémoire côté CPU peut nuire à l’alimentation du GPU.

Décision : Si les dataloaders sont gourmands en CPU, liez-les au nœud NUMA le plus proche du GPU avant de blâmer la largeur du bus VRAM.

Task 4: Check for GPU throttling (power/thermal)

cr0x@server:~$ nvidia-smi -q -d PERFORMANCE | sed -n '/Clocks/,/Power Readings/p'
    Clocks
        Graphics                          : 1200 MHz
        SM                                : 1200 MHz
        Memory                            : 6250 MHz
    Power Readings
        Power Draw                        : 229.50 W
        Power Limit                       : 230.00 W
        Default Power Limit               : 230.00 W

Signification de la sortie : Vous êtes au plafond de puissance ; les horloges peuvent être limitées.

Décision : Si vous êtes en throttling de puissance, un bus plus large peut ne pas aider ; vous pourriez simplement transformer des watts en déception. Envisagez d’ajuster la limite de puissance ou une meilleure dissipation d’abord.

Task 5: Watch real-time utilization during the slow phase

cr0x@server:~$ nvidia-smi dmon -s pucvmt
# gpu   pwr  u    c    v    m    t
# Idx   W    %    %    %    %    C
    0   218  95   78    6   74   62
    0   225  94   76    5   75   63

Signification de la sortie : Haute consommation, haute utilisation SM (c), l’utilisation mémoire (m) est aussi assez élevée.

Décision : Cela suggère un goulot mixte. Vous aurez besoin de compteurs de profilage (pas de suppositions) pour décider si la bande passante est le limiteur.

Task 6: Inspect GPU clocks and ensure they’re not stuck low

cr0x@server:~$ nvidia-smi --query-gpu=clocks.sm,clocks.mem,clocks.gr,pstate --format=csv
clocks.sm [MHz], clocks.mem [MHz], clocks.gr [MHz], pstate
1200, 6250, 1200, P2

Signification de la sortie : En état P2, l’horloge mémoire peut être correcte mais les horloges graphiques peuvent être gérées selon le mode de compute.

Décision : Si les horloges sont anormalement basses, vérifiez les réglages d’horloge applicative et le mode de persistance ; corrigez cela avant de spéculer sur la largeur du bus.

Task 7: Check kernel launch configuration and occupancy hints (CUDA app)

cr0x@server:~$ nvprof --print-gpu-trace ./my_cuda_app 2>&1 | head -n 12
==12345== NVPROF is profiling process 12345, command: ./my_cuda_app
==12345== Profiling application: ./my_cuda_app
Time(%)      Time     Calls       Avg       Min       Max  Name
 45.12%  12.345ms       200  61.72us  40.11us  98.22us  myKernel(float*, float*)
 21.77%   5.950ms       200  29.75us  18.20us  66.50us  layernormKernel(float*, float*)

Signification de la sortie : Identifie les kernels les plus chauds. Layernorm est souvent limité par la mémoire ; votre kernel custom peut l’être aussi.

Décision : Profilez les kernels les plus chauds avec un outil de métriques ; si layernorm domine, envisagez la fusion ou des bibliothèques optimisées avant de changer le hardware.

Task 8: Use Nsight Compute to check DRAM throughput (single kernel)

cr0x@server:~$ ncu --set full --kernel-name layernormKernel ./my_cuda_app 2>/dev/null | egrep 'dram__throughput|sm__throughput|gpu__time_duration' | head
gpu__time_duration.avg                         28.41 us
dram__throughput.avg                           612.34 GB/s
sm__throughput.avg                             31.12 %

Signification de la sortie : Le débit DRAM est élevé tandis que le débit SM est plutôt bas. C’est le comportement classique d’une charge limitée par la bande passante.

Décision : Un bus plus large (ou un GPU à bande passante supérieure) peut aider si le kernel peut monter en échelle avec la bande passante. Essayez d’abord la fusion de kernels et l’optimisation des accès mémoire.

Task 9: Estimate arithmetic intensity (quick sanity check)

cr0x@server:~$ python3 - <<'PY'
flops = 2.0e12
bytes = 8.0e12
print("Arithmetic intensity (FLOPs/byte):", flops/bytes)
PY
Arithmetic intensity (FLOPs/byte): 0.25

Signification de la sortie : 0.25 FLOPs/byte est faible ; probablement limité par la bande passante sur les GPU modernes.

Décision : Priorisez la bande passante (VRAM ou efficacité du cache) et les techniques de réutilisation des données ; n’attendez pas qu’un upgrade compute résolve tout.

Task 10: Check if the app is moving too much over PCIe

cr0x@server:~$ nvidia-smi pmon -c 1
# gpu        pid  type    sm   mem   enc   dec   jpg   ofa   fb   command
    0      28741     C     72    68     0     0     0     0  18123  python3

Signification de la sortie : Montre l’utilisation GPU par processus. Pas le PCIe directement, mais indique quel processus instrumenter.

Décision : Si plusieurs processus partagent le GPU, la contention mémoire peut être la vraie cause ; isolez la charge ou utilisez MIG (si supporté) plutôt que d’acheter pour la largeur du bus.

Task 11: Confirm hugepages/IOMMU settings for DMA-heavy paths (platform sanity)

cr0x@server:~$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-6.8.0 root=/dev/nvme0n1p2 ro quiet iommu=pt

Signification de la sortie : IOMMU est en mode passthrough (iommu=pt), souvent bon pour la performance DMA.

Décision : Si vous constatez de faibles taux de transfert hôte→device, vérifiez IOMMU/ACS et le BIOS avant de blâmer la largeur du bus VRAM.

Task 12: Check NUMA placement of the process relative to the GPU

cr0x@server:~$ numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
cpubind: 0
nodebind: 0
membind: 0

Signification de la sortie : Le processus est lié au nœud NUMA 0. Si le GPU est attaché au nœud 1, vous prenez un saut inter-socket.

Décision : Lieez le dataloader et les threads d’alimentation du GPU au nœud NUMA le plus proche ; cela peut faire la différence entre « acheter un bus plus large » et « arrêtez de vous saboter ».

Task 13: Measure raw PCIe bandwidth with a quick copy test (if CUDA samples installed)

cr0x@server:~$ /usr/local/cuda/samples/bin/x86_64/linux/release/bandwidthTest --mode=quick
[CUDA Bandwidth Test] - Starting...
Device 0: NVIDIA RTX A5000
 Quick Mode
 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)  Bandwidth(MB/s)
   33554432               23500.2
 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)  Bandwidth(MB/s)
   33554432               24410.7

Signification de la sortie : H2D/D2H ~23–24 GB/s en pinned, cohérent avec PCIe Gen4 x16-ish. Si vous aviez 10 GB/s, quelque chose cloche.

Décision : Si les transferts sont lents, corrigez le PCIe d’abord. La largeur du bus VRAM n’aidera pas si vous alimentez le GPU via une paille.

Task 14: Check VRAM error counters / ECC where applicable

cr0x@server:~$ nvidia-smi -q -d ECC | sed -n '/Volatile/,/Aggregate/p'
    Volatile ECC Errors
        SRAM Correctable                  : 0
        DRAM Correctable                  : 0
        SRAM Uncorrectable                : 0
        DRAM Uncorrectable                : 0
    Aggregate ECC Errors
        SRAM Correctable                  : 0
        DRAM Correctable                  : 0
        SRAM Uncorrectable                : 0
        DRAM Uncorrectable                : 0

Signification de la sortie : Pas de problèmes ECC. Si vous aviez des erreurs corrigeables en hausse, vous pourriez voir des retries/anomalies de perf selon la plateforme.

Décision : Écartez d’abord une instabilité matérielle avant de tuner. Débugger des perfs sur de la RAM défectueuse, c’est comme écoper un bateau en perçant de nouveaux trous.

Trois micro-histoires du monde de l’entreprise (anonymisées, plausibles, techniquement exactes)

Micro-histoire 1 : L’incident causé par une mauvaise hypothèse

Une équipe a déployé un service d’inférence GPU pour des embeddings d’images. Le modèle était modeste, l’objectif de latence strict, et le trafic était en pics.
Les achats ont choisi un SKU GPU avec un bus plus étroit mais de bons specs de compute, parce que « nous faisons des multiplications matricielles ; le compute compte ».

Ça a passé la staging. Ça a même passé la première semaine en production. Puis un changement produit a augmenté la résolution d’entrée et ajouté une seconde tête au modèle.
L’on-call a commencé à voir l’augmentation des latences extrêmes durant les pics. La latence moyenne semblait correcte, parce que les moyennes sont de bonnes mentores publicitaires.

La première supposition fut « goulot CPU ». Ils ont ajouté du CPU. Pas de changement. Puis « goulot PCIe ». Ils ont épinglé la mémoire et augmenté les tailles de lot.
Le débit a augmenté, mais la latence en queue est restée mauvaise. Finalement quelqu’un a profilé le chemin chaud et a trouvé que la charge était devenue limitée par la mémoire :
layernorms et composants de type attention faisaient beaucoup de lectures/écritures à batch=1, et le cache ne les sauvait pas.

La mauvaise hypothèse n’était pas « la largeur du bus compte ». La mauvaise hypothèse était « nous sommes compute-bound parce que le modèle utilise matmul ».
Dans les services réels, la forme et le batching dictent les goulots. Ils ont migré vers un SKU à bande passante plus élevée et ont aussi fusionné quelques ops.
La latence s’est stabilisée. Les achats ont arrêté de demander une règle de décision à un seul chiffre. Plus ou moins.

Micro-histoire 2 : L’optimisation qui a fait rebrousser chemin

Une autre organisation entraînait des modèles de recommandation avec de grands embeddings. Ils ont voulu réduire l’usage VRAM, alors ils ont appliqué un checkpointing d’activations agressif et de la recomputation.
Cela a réduit le pic mémoire, leur permettant d’augmenter la taille de lot. Tout le monde a applaudi. Puis le débit a chuté.

Le profiling a montré une montée des petits kernels et une matérialisation supplémentaire de tenseurs. La recomputation a créé plus de trafic mémoire que prévu, et la plus grande
taille de lot a poussé le jeu de travail au-delà du cache plus souvent. Les GPUs à bus plus étroit qui semblaient « corrects » avant ont commencé à saturer le débit DRAM.

Le contre-effet était subtil : ils avaient « optimisé la mémoire » mais créé un problème de bande passante. Les pas d’entraînement sont devenus limités par la bande passante, pas par le compute.
Les GPUs affichaient une utilisation décente, mais le pipeline mémoire était le mur. Ajouter plus de GPU n’a pas aidé ; ils ont scalable un goulot.

La solution n’était pas purement matérielle. Ils ont retravaillé le modèle pour réduire la taille du hot-set d’embeddings, utilisé des optimizers fusionnés, et modifié le layout des données pour une meilleure localité.
Ils ont aussi standardisé des pièces à plus haute bande passante pour ce cluster. La leçon : économiser de la VRAM et économiser de la bande passante sont deux jeux différents, et ils ne s’accordent pas toujours.

Micro-histoire 3 : La pratique ennuyeuse mais correcte qui a sauvé la mise

Une équipe plateforme gérait une flotte mixte : quelques GPU à haute bande passante pour l’entraînement, et un plus grand pool de GPUs à bus étroits pour le compute général et le CI.
Chaque trimestre, quelqu’un essayait de réaffecter temporairement le pool à bus étroit pour de l’entraînement « temporairement ». Temporairement, c’est comme naissent les outages.

La pratique ennuyeuse de l’équipe était un benchmark de gate dans le pipeline de déploiement : une courte suite mesurant la bande passante DRAM atteinte et un petit ensemble de kernels représentatifs.
Si un nœud sous-performait, il était mis en quarantaine automatiquement. Pas de blâme, pas de drame, juste une étiquette et un ticket.

Un jour, après une mise à jour du pilote et un changement BIOS sur une nouvelle révision de carte mère, ils ont remarqué que le benchmark avait signalé la moitié d’une baie.
La largeur du lien PCIe s’était négociée en bas, et les horloges mémoire ne boostaient pas correctement sous charge soutenue. Sans le benchmark, l’équipe d’entraînement l’aurait découvert en plein run, en plein trimestre, en plein doute.

Ils ont rollbacké le réglage BIOS, corrigé le mapping des slots, et la flotte est revenue à la normale. Ce n’était pas glamour.
C’était le genre d’« hygiène ops » qui n’a jamais de slide dans le all-hands — jusqu’à ce que ça évite une escalade exécutive.

Blague n°2 : Rien ne motive un audit de bande passante comme la réalisation que votre « upgrade GPU » était en fait un downgrade BIOS avec un meilleur branding.

Erreurs fréquentes : symptômes → cause → réparation

1) Symptom: Great benchmarks, awful real app

Cause : Les tests synthétiques touchent des motifs mémoire idéalement coalescés ; votre appli fait du scatter/gather ou a une mauvaise localité.

Réparation : Profilez avec des compteurs au niveau kernel (débit DRAM, taux de hits cache). Re-déployez le layout des données, coalescer les accès, fusionner les kernels.

2) Symptom: Performance tanks only at 4K / high textures

Cause : Le jeu de travail dépasse le cache ; la bande passante et la capacité VRAM sont mises sous forte pression.

Réparation : Réduisez la résolution des textures, ajustez les réglages de streaming, activez/affinez la compression, ou utilisez un GPU à bande passante supérieure.

3) Symptom: Inference throughput fine, latency terrible

Cause : L’inférence à petits lots devient limitée par la mémoire sur le KV cache/layernorm/opérations élémentaires.

Réparation : Utilisez la fusion de kernels, la quantification si adapté, ou choisissez un GPU avec meilleure bande passante/cache pour le batch=1.

4) Symptom: New GPU doesn’t outperform old GPU in your pipeline

Cause : Vous êtes limité par le CPU, l’I/O, ou PCIe ; la largeur du bus VRAM est hors sujet.

Réparation : Mesurez les transferts hôte→device, la vitesse du dataloader, l’utilisation CPU. Corrigez le chemin d’alimentation (pinned memory, pipelines asynchrones, binding NUMA).

5) Symptom: Performance varies wildly run-to-run

Cause : Sensibilité au taux de hits cache, contention de fond, throttling thermique/de puissance, ou charges mixtes sur le même GPU.

Réparation : Stabilisez les horloges/la puissance, isolez les charges, réchauffez les caches, épinglez les processus, et assurez un lot et un ordre de données constants.

6) Symptom: Memory utilization low, but DRAM throughput high

Cause : « Memory utilization » dans certains outils n’est pas un « bandwidth used » direct ; c’est parfois un métrique d’occupation du contrôleur.

Réparation : Utilisez des compteurs de profiler (Nsight Compute). Ne traitez pas « mem % » comme un GB/s direct.

7) Symptom: VRAM bandwidth looks capped below theoretical

Cause : Limites de puissance, horloges mémoire basses, motifs d’accès sous-optimaux, ou overhead de concurrence.

Réparation : Vérifiez les horloges et le pstate, contrôlez la consommation, et testez avec un benchmark de bande passante connu pour séparer la plateforme du comportement applicatif.

Listes de contrôle / plan étape par étape

Checklist: deciding if you should care about 128 vs 256 vs 384-bit

  1. Calculez la bande passante théorique pour chaque candidat (bus × débit de données).
  2. Listez les modes de charge (ex. 1080p vs 4K ; batch=1 vs batch=32 ; entraînement vs inférence).
  3. Profilez une exécution représentative et capturez le débit DRAM + utilisation SM/Tensor.
  4. Si le débit DRAM est proche du pic et l’utilisation SM est faible/modérée : la bande passante compte.
  5. Si l’utilisation SM/Tensor est proche du pic et le débit DRAM modéré : la largeur du bus n’aidera probablement pas.
  6. Si le lien PCIe est en x8 ou Gen3 de façon inattendue : corrigez la plateforme avant la sélection matérielle.
  7. Si la capacité VRAM est serrée et que vous swappez/évincez : la capacité peut compter plus que la largeur.
  8. Décidez sur la base du coût par débit livré, pas sur l’esthétique de la fiche technique.

Step-by-step: improving a bandwidth-bound workload without new hardware

  1. Mesurez : Identifiez les kernels dominants et vérifiez qu’ils sont bandwidth-bound avec des compteurs.
  2. Réduisez le trafic : Fusionnez les ops élémentaires ; évitez les allers-retours en VRAM entre petits kernels.
  3. Améliorez la localité : Changez le layout des données pour mieux coalescer et réutiliser.
  4. Utilisez la bonne précision : FP16/BF16/INT8 quand c’est valide pour réduire les octets déplacés.
  5. Batchez intelligemment : Augmentez le batch quand le débit importe ; gardez le batch petit pour la latence, mais optimisez alors le comportement mémoire.
  6. Minimisez les transferts : Utilisez la mémoire épinglée, chevauchez transferts et compute, gardez le prétraitement sur GPU quand sensé.
  7. Stabilisez les horloges : Évitez les throttling involontaires de puissance/thermique qui réduisent la bande passante atteignable.

Step-by-step: selecting hardware when bandwidth is the bottleneck

  1. Estimez la bande passante requise à partir des octets déplacés par unité de temps (depuis le profiler ou les logs).
  2. Comparez les GPUs candidats par bande passante (pas seulement la largeur du bus), taille de cache et type de mémoire.
  3. Validez avec un run pilote utilisant votre charge réelle, pas seulement des microbenchmarks.
  4. Vérifiez la plateforme : génération PCIe, largeur du lien, layout NUMA CPU, et refroidissement.
  5. Prévoyez de la marge : croissance future du modèle, résolutions plus élevées, et concurrence.

FAQ

1) Un bus 256 bits est-il toujours mieux qu’un bus 128 bits ?

Non. Si la carte 128 bits utilise une mémoire beaucoup plus rapide, a un cache plus grand, ou si votre charge est compute-bound, elle peut égaler ou battre une carte 256 bits.
Comparez la bande passante effective et profilez votre charge.

2) Pourquoi certains GPU à bus plus étroit performent-ils étonnamment bien ?

Gros caches, bonne compression, et charges avec forte localité. Si vous tapez dans le cache, vous n’avez pas besoin de la bande passante VRAM aussi souvent.
Mais la performance peut chuter rapidement quand le jeu de travail grandit.

3) La largeur du bus affecte-t-elle la capacité VRAM ?

Indirectement. La largeur du bus est liée au nombre de canaux mémoire et à l’organisation des puces.
Certaines capacités se mappent naturellement à certains nombres de canaux ; des capacités impaires peuvent nécessiter des packaging ou configurations spéciales.

4) Pour l’entraînement ML, dois-je prioriser la largeur du bus ou les Tensor cores ?

Aucun des deux isolément. Profilez votre modèle. Si vous êtes dominé par de grands matmuls et des projections d’attention bien fusionnées, le compute compte.
Si layernorm/ops élémentaires/réductions et trafic d’embeddings dominent, la bande passante mémoire compte davantage.

5) Comment savoir rapidement si je suis limité par la bande passante VRAM ?

Utilisez un profiler : fort débit DRAM et faible utilisation SM/Tensor est la signature. Surveillez aussi comment la performance évolue quand vous réduisez les octets déplacés
(résolution/tensors plus petits). Une montée à peu près linéaire est un indice.

6) Le « pourcentage d’utilisation mémoire » dans les outils de monitoring est-il un indicateur fiable de bande passante ?

Pas de façon fiable. C’est souvent un métrique d’occupation du contrôleur ou une mesure normalisée. Utilisez les compteurs GB/s d’un profiler pour des réponses réelles.

7) La vitesse PCIe compte-t-elle plus que la largeur du bus VRAM ?

Si vous déplacez fréquemment des données entre l’hôte et le GPU, oui — PCIe peut dominer. Si vos données restent résidentes en VRAM et que vous lisez/écrivez surtout la VRAM,
PCIe importe beaucoup moins que la bande passante VRAM.

8) Les correctifs logiciels peuvent-ils battre un bus mémoire plus large ?

Souvent. La fusion de kernels, un meilleur layout des données, une meilleure localité et la réduction de précision peuvent réduire considérablement le trafic mémoire.
Mais si vous êtes déjà efficace et toujours limité par la bande passante, l’échappatoire est matérielle.

9) Pourquoi deux GPU avec une bande passante similaire performent-ils différemment sur des tâches gourmandes en bande passante ?

Le sous-système mémoire n’est pas que de la bande passante de pointe : tailles de cache, politiques de cache, gestion de latence, conception du contrôleur mémoire,
et concurrence comptent tous. « Même GB/s » ≠ « même débit réel ».

10) Quand un bus 384 bits a-t-il un sens évident ?

Graphismes haute résolution avec effets lourds, kernels compute bandwidth-bound, grands jeux de travail qui missent le cache, et charges qui montrent une forte
montée avec la bande passante en profilage. Si vous ne pouvez pas démontrer la pression sur la bande passante, ne payez pas pour cela.

Conclusion : étapes pratiques suivantes

La largeur du bus mémoire n’est pas un talisman de performance. C’est un contributeur à la bande passante, et la bande passante ne compte que quand vous êtes réellement limité par elle.
Si vous diagnosez une charge GPU lente, ne commencez pas par « 128 bits vs 256 bits ». Commencez par la mesure.

Étapes suivantes que vous pouvez faire cette semaine :

  • Calculez la bande passante VRAM théorique pour vos GPU actuels et vos candidats.
  • Exécutez le playbook de diagnostic rapide et capturez un rapport de profiler pour la phase lente.
  • Corrigez d’abord les problèmes de plateforme : largeur du lien PCIe, throttling puissance/thermique, placement NUMA.
  • Si vous êtes bandwidth-bound : réduisez les octets déplacés via fusion/layout/précision ; puis évaluez du matériel à plus haute bande passante.
  • Institutionnalisez un petit benchmark gate afin que les « débats sur la largeur du bus » deviennent des données, pas des réunions.
← Précédent
MySQL vs CockroachDB : SQL distribué sur petits serveurs — la taxe de latence dont personne ne parle
Suivant →
AMD VCN/VCE : pourquoi le bloc codec compte plus que vous ne le pensez

Laisser un commentaire