← Retour aux projets

Inside an AI Chip

Schémas interactifs accompagnant la conversation entre Reiner Pope (CEO MatX) et Dwarkesh Patel. Du gate logique jusqu'à l'organisation des SMs et MXUs, en passant par les multiplieurs de Dadda, les systolic arrays et le pipeline registers.

Transcriptions : EN · FR

1 · AND gate & full adder

Les deux briques primitives à partir desquelles tout est construit.

Toute l'arithmétique d'une puce IA est faite de deux portes logiques : AND (la plus petite) et full adder (la plus grande couramment utilisée). Le full adder additionne trois bits de la même colonne et produit deux bits — somme et retenue. On l'appelle aussi 3→2 compressor.

AND gate A B Y 0 0 0 tap to toggle Full adder (3→2) x y cin FA x+y+cin sum 0 cout 0 0 0 0 3 bits in → 2 bits out · sum stays in column, carry shifts left.
Touchez les bits pour basculer 0/1 — observez la sortie en temps réel.
xycincoutsum
00000
00101
01001
01110
10001
10110
11010
11111

2 · Long multiplication 4×4 + accumulateur 8 bits

16 produits partiels générés par 16 AND gates.

L'objectif : calculer A × B + C avec A, B sur 4 bits et C sur 8 bits — c'est exactement le multiply-accumulate qui apparaît à chaque itération d'un produit matriciel. Chaque produit partiel Ai · Bj est une simple AND.

A = 1001 B = 1010 ×b₀ 0000 ×b₁ 1001 ×b₂ 0000 ×b₃ 1001 +C 0110 1101 = 10 11 11 10 (= 9 × 10 + 109 = 199) Click Next step
9 (1001) × 10 (1010) + 109 (01101101) = 199 (11000111)
p × q AND gates suffisent pour générer tous les produits partiels. Le reste — additionner ces 16 bits — est le travail des full adders.

3 · Multiplieur de Dadda — compression colonne par colonne

Standard "area-efficient" : exactement p×q full adders.

Au lieu de retenir mentalement les retenues comme un humain, le multiplieur de Dadda écrit chaque retenue. À chaque pas, un triplet de bits dans une colonne est remplacé par une somme (même colonne) et une retenue (colonne suivante à gauche). On élimine un bit par full adder.

Step 0 / 16 24 bits remaining
Chaque point = un bit à additionner. La barre dorée = full adder qui écrase 3 bits en 2.
Comptage des gates : on entre avec p·q + (p+q) bits, on sort avec p+q bits. Chaque full adder retire un bit → p·q full adders exactement. Combiné aux p·q ANDs des produits partiels, ce scaling quadratique en bit-width est la raison fondamentale pour laquelle FP4 explose en performance.

4 · Scaling quadratique : aire ∝ bit-width²

Pourquoi NVIDIA devrait annoncer 4× et pas 3× pour FP4.

Faites varier la précision et observez l'aire occupée par le multiplieur. Une cellule = un gate (AND ou full adder). Diviser la précision par 2 divise l'aire par 4, pas par 2.

8 bits → 64 gates
Aire = p² gates (côté ALU). Doubler la précision quadruple le silicium.
À iso-aire : FP4 ≈ 4× plus de throughput que FP8. Le ratio annoncé par NVIDIA (3× sur B300) sous-estime encore le gain théorique — d'autres contraintes (data movement, packaging mémoire) entrent en jeu.

5 · Mux & le coût caché du data movement

Avant les Tensor Cores : 7/8 du silicium servait juste à déplacer des bits.

Un CUDA core classique lit 3 registres, fait un MAC, écrit le résultat. La sélection « registre n° i » est réalisée par un multiplexeur (mux). Choisissez le registre source ci-dessous — le chemin doré illustre la masse de portes logiques utilisées juste pour acheminer la donnée.

Register file (8 entries) mux A mux B mux C MAC A·B+C writeback data movement (≈ 87%) useful compute (≈ 13%)
Sélectionnez la source pour chaque mux : observez le wire actif s'illuminer.
3 × n × p AND gates pour le data movement contre p × q pour le calcul. Avec n=8, ça représente ~87% du silicium gaspillé en routage. C'est ce problème que les Tensor Cores et systolic arrays résolvent.

6 · Systolic array — matrice × vecteur en hardware

Quadratique en compute, linéaire en communication.

Les poids restent fixés dans les cellules. Le vecteur entre par le haut et descend cycle par cycle. Les sommes partielles s'accumulent verticalement. Pour une matrice n×n, n² MACs s'exécutent en parallèle, mais seulement n entrées traversent la frontière du tableau.

cycle 0
Matrice 3×3 fixée localement. Vecteur (1,2,3) entrant par le haut, dot products sortant par le bas.
Pourquoi ça marche : en IA, la matrice (les poids) reste constante pour des milliers de vecteurs (les activations). On amortit le coût du data movement sur tout le tableau. C'est la brique fondamentale des MXUs des TPUs et des Tensor Cores des GPUs.

7 · Horloge globale & pipeline registers

Doubler la fréquence en coupant le nuage de logique en deux.

Un registre = une bascule qui capture l'état présent sur son fil à chaque coup d'horloge. Entre deux registres, un nuage de portes calcule. Le délai à travers ce nuage fixe la fréquence maximale. Insérer un registre au milieu coupe le délai en deux → 2× fréquence.

Before — 1 GHz · 1 trip R combinational logic (cloud) delay ≈ 1 ns R clk = 1 GHz After — 2 GHz · 2 trips (pipeline register in the middle) R cloud / 2 0.5 ns R cloud / 2 0.5 ns R
Trade-off : aire supplémentaire (le registre intermédiaire) contre throughput doublé.

Limite : dans une boucle de feedback (accumulateur), insérer un registre change la sémantique du calcul (on obtient deux sommes entrelacées sur bits pairs/impairs). C'est ce qui fixe la fréquence d'horloge réelle des chips.

8 · LUT — la "porte logique programmable" d'un FPGA

16 entrées de table de vérité = n'importe quelle fonction 4→1.

Un LUT à 4 entrées est un mux 16:1 où les 16 valeurs sont stockées en SRAM de configuration. Modifiez la table de vérité pour reproduire un AND, un XOR, un majoritaire, etc.

mux 16:1 (SRAM truth table) Y 0 presets:
Tap sur une ligne de la SRAM pour basculer le bit. Cliquez sur les entrées A,B,C,D pour changer l'adresse lue.
Pourquoi un FPGA coûte ~10× plus cher qu'un ASIC : un AND à 4 entrées = 3 gates en ASIC, mais ~32 gates en passant par un LUT. La flexibilité du tape-out à 10k$ se paie en silicium permanent.

9 · Cache (CPU) vs scratchpad (TPU)

Hardware decides vs software decides.

CPU core Cache (hardware-decided) hit ? miss ? non-deterministic DDR (off-chip) 1 load instr → ? TPU MXU + vector Scratchpad (SRAM) instr A → always 1 ns HBM (off-chip) instr B → dev's call
Sur TPU, deux opcodes distincts ciblent scratchpad ou HBM — le compilateur choisit, le hardware exécute.

Cache (CPU/GPU)

  • Décision : hardware (transparent)
  • Latence : variable selon hit/miss
  • Avantage : 100× plus rapide que DDR sans effort dev
  • Coût : non-déterminisme, complexité (prédicteurs, cohérence)

Scratchpad (TPU/Groq)

  • Décision : software (compilateur/dev)
  • Latence : déterministe
  • Avantage : simplicité hardware, débogabilité, scheduling exact
  • Coût : burden sur le compilateur, programme moins portable

10 · Floorplans CPU / GPU / TPU

Un GPU = un grand nombre de petits TPUs.

CPU L3 cache (≈40%) branch pred. core register file ALU ≈ 5% GPU L2 SM = streaming multiproc. TPU MXU vector unit MXU few large units
Même surface ; granularité radicalement différente. Le GPU laisse de la flexibilité, le TPU maximise l'efficacité par MM.
Trade-off final : grandes unités (TPU) = meilleur amortissement du register file, mais data movement contraint à 2 lignes de périmètre. Petites unités (GPU) = bande passante riche entre vector et matrix au sein d'un SM, mais coûteuse entre SMs.

11 · Dynamic / switching power

Chaque bit qui flip = un condensateur qui se charge puis se vide.

L'énergie totale d'une puce est dominée par les transitions. Ralentir l'horloge 1000× baisse la consommation 1000×, mais l'énergie par opération reste identique — pas un gain d'efficacité.

Clock signal Capacitor charge state bit = 0 (discharged) ↑ each flip dissipates energy
Le condensateur stocke le bit. La transition 0→1 ou 1→0 dépose ou évacue de la charge — c'est là que va l'énergie.