Pidoku

Hopper: H100 and H200

Module 7 Lesson 7.b 50 min Difficulty 3/5

Prerequisites 2.a, 2.b, 2.c, 2.d

The idea in one minute#

The H100 is the best-documented AI chip ever made and still the largest installed base, so it is the one to know by heart. It is one large die (GH100) in the middle of a package, surrounded by stacks of HBM, sitting on a silicon interposer. The die is a grid of 8 GPCs, each holding 18 SMs; 132 of the 144 SMs are switched on. Each SM is split into 4 partitions, each with its own scheduler, registers, 32 FP32 lanes and one tensor core.

Learn this one floorplan and every later NVIDIA GPU reads as a variation of it: more SMs, a second die, a different memory, a faster link. Facts checked on 16 October 2026.

A picture#

NVIDIA H100 SXM5 · PACKAGE AND GH100 DIEHopper · 2022 · schematic, not to scale · checked 16 Oct 2026SXM5 module substrateCoWoS-S silicon interposerHBM316 GB~670 GB/sHBM316 GB~670 GB/sHBM316 GB~670 GB/sHBM316 GB~670 GB/sHBM316 GB~670 GB/sunused site(6th stack)NVLINK 4 PHY · 18 LINKSPCIE GEN 5 x16 · HOST I/OGPC 0SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMGPC 1SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMGPC 2SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMGPC 3SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMGPC 4SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMGPC 5SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMGPC 6SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMGPC 7SMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSML2 · 25 MBL2 · 25 MB123456789WHAT YOU ARE LOOKING AT1GPC × 8Graphics processing cluster: 9 TPCs = 18 SMs on thefull die. Work is spread across GPCs by theGigaThread engine.2SM, 132 of 144 enabledEach tile is a streaming multiprocessor; the darkband is its 4 tensor cores. Hatched tiles are fusedoff to raise yield.3L2 cache, 50 MBTwo halves joined by a crossbar. Every byte fromHBM passes through it.4HBM3 stack16 GB each, stacked DRAM dies on a 1,024-bitinterface. Five stacks = 80 GB.5Memory PHYsTen 512-bit controllers: a 5,120-bit bus to HBM,3.35 TB/s.6NVLink 418 links, 900 GB/s total, to NVSwitch chips on theHGX baseboard.7PCIe Gen 5 x1664 GB/s each way to the host CPU: 14x less thanNVLink.8The empty sixth siteSix HBM sites exist; H100 ships with five. H200fills all six with HBM3e: 141 GB, 4.8 TB/s.9Package814 mm² die, 80 B transistors on TSMC 4N, on aCoWoS-S interposer, on the SXM5 module.SIDE VIEW · SECTION THROUGH THE PACKAGElogic dieHBM: 8-16 DRAM dies, joined by TSVsHBM base (logic) dieGPU logic die, flip-chip on microbumpsSilicon interposer: short, dense wiresOrganic substrate; bumps to the moduleDIE814 mm²80 B transistorsSMS132528 tensor coresFP8 DENSE1,979 TF3,958 with sparsityBF16 DENSE989 TFFP32 67 TFMEMORY80 GBHBM3 · 3.35 TB/sPOWER700 WSXM5, liquid or airComputeMatrix unitsOn-chip SRAM / cacheOff-chip memoryI/O and PHYsInterconnectDisabled / spareSource: NVIDIA H100 Tensor Core GPU Architecture whitepaper; H100 SXM5 datasheet. Tile positions of fused-off SMs vary per chip.
The H100 package from above, with a side section below. Hatched SM tiles are fused off: every H100 has 12 disabled SMs, in different places on each chip.
INSIDE ONE HOPPER SM · H1004 partitions · 1 warp scheduler each · checked 16 Oct 2026L1 instruction cachePARTITION 0L0 i-cacheWarp schedulerDispatch · 32 thr/clkRegister file · 16,384 × 32-bit = 64 KBINT32 ×16FP32 ×32FP64 ×16Tensor Core4th gen · FP8LD/ST ×8SFU ×4PARTITION 1L0 i-cacheWarp schedulerDispatch · 32 thr/clkRegister file · 16,384 × 32-bit = 64 KBINT32 ×16FP32 ×32FP64 ×16Tensor Core4th gen · FP8LD/ST ×8SFU ×4PARTITION 2L0 i-cacheWarp schedulerDispatch · 32 thr/clkRegister file · 16,384 × 32-bit = 64 KBINT32 ×16FP32 ×32FP64 ×16Tensor Core4th gen · FP8LD/ST ×8SFU ×4PARTITION 3L0 i-cacheWarp schedulerDispatch · 32 thr/clkRegister file · 16,384 × 32-bit = 64 KBINT32 ×16FP32 ×32FP64 ×16Tensor Core4th gen · FP8LD/ST ×8SFU ×4256 KB L1 data cache / shared memoryconfigurable split: up to 228 KB sharedTensor Memory Accelerator4 texture units · tex cache123456HOW A WARP MOVES THROUGH IT1Pick a warpEach cycle, each of the 4 schedulers picks oneready warp (32 threads) from up to 16 residentones and issues one instruction.2Read registersOperands come from a 64 KB register file perpartition: 256 KB per SM, more than the L1.3Scalar lanesOrdinary arithmetic runs on 32 FP32 lanes: onewarp instruction per clock.4Tensor coreA matrix instruction (wgmma) feeds whole tilesto the tensor core. This is where ~95% of anLLM's FLOPs go.5Shared memoryTiles are staged here so 32 threads can reuseeach byte many times before going back to L2.6TMACopies whole tiles between HBM and sharedmemory asynchronously, so threads keepcomputing.PER SM128 FP32lanes per clockTENSOR CORES42,048 dense FP16 FMA/clkREGISTERS256 KB65,536 × 32-bitL1 / SHARED256 KB≤228 KB sharedRESIDENT64 warps2,048 threads max
One of the 132 SMs. Lanes are drawn to count: every small square is one functional unit.

How it really works#

From package to lane#

Read the first drawing from the outside in.

  1. The module. An SXM5 board carries the package, power delivery for 700 W and the NVLink connectors to the HGX baseboard.
  2. The package. A CoWoS-S silicon interposer holds the die and the HBM stacks side by side. The interposer exists because a 5,120-bit memory bus needs thousands of wires a few millimetres long; no circuit board can route that.
  3. The die. 814 mm² and 80 billion transistors on TSMC 4N, close to the largest die a lithography machine can expose in one shot (the reticle limit, about 830 mm²).
  4. GPCs. Eight graphics processing clusters. A GPC groups 9 TPCs, each of two SMs. The GigaThread engine hands thread blocks to GPCs.
  5. SMs. 144 on the full die; 132 on an H100 SXM5 (114 on the PCIe card). A die that large almost always has defects; designing in spare SMs and fusing off the bad ones turns a defective die into a sellable one. This is why every H100 has a slightly different set of working SMs.
  6. Partitions and lanes. Inside each SM, four schedulers each issue one warp instruction per clock to their own 32 FP32 lanes, 16 INT32, 16 FP64, 8 load/store units, 4 special-function units and one tensor core (second drawing).

What Hopper added#

Hopper is the generation where the GPU was redesigned around transformers:

FeatureWhat it doesWhy it mattered
FP8 tensor cores + Transformer EngineMatrix math in 8-bit floats, with per-tensor scaling managed in softwareDoubled throughput over FP16 for training and inference
wgmma (warpgroup MMA)Four warps issue one large asynchronous matrix multiply togetherKeeps the tensor cores fed while threads do other work
TMA (Tensor Memory Accelerator)One thread describes a whole tile copy; hardware does itFrees registers and threads from address arithmetic
Thread block clusters + distributed shared memoryBlocks on neighbouring SMs read each other’s shared memoryBigger tiles without a round trip through L2
NVLink 4 + third-generation NVSwitch18 links, 900 GB/s per GPU8-GPU tensor parallelism without the network
Confidential computingEncrypted, attested GPU memoryRegulated workloads on shared clouds

FlashAttention-3 and the fast FP8 GEMMs in cuBLAS and CUTLASS are written around wgmma and TMA. Code written for A100-style mma.sync runs on Hopper, but at a fraction of peak.

H100 variants and H200#

H100 PCIeH100 SXM5H100 NVLH200 (SXM)
SMs114132132132
Memory80 GB HBM2e80 GB HBM394 GB HBM3141 GB HBM3e
Bandwidth2.0 TB/s3.35 TB/s3.9 TB/s4.8 TB/s
Power350 W700 W400 W700 W

The H200 is the same GH100 die. The only change is the memory: all six HBM sites filled, with faster HBM3e. That alone makes it about 1.4x faster at memory-bound decoding and lets a 70B model at FP8 fit on one GPU with room for a KV cache. It is the cleanest real-world proof that, for LLM inference, memory is the product.

The numbers, derived#

NVIDIA’s 989 TFLOP/s of dense BF16 is not magic; it is a product of four counts:

132 SMs × 4 tensor cores × 512 FMA per clock per tensor core × 2 FLOP per FMA × 1.83 GHz
= 989 TFLOP/s

FP8 doubles the FMAs per clock: 1,979 TFLOP/s. The “with sparsity” figures double again, but only for weights pruned to a 2-of-4 pattern, which almost no production LLM uses. Quote dense numbers.

Divide peak math by bandwidth and you get the machine balance: the arithmetic intensity a kernel needs to be compute-bound (4.a).

Code#

Go
// hopper.go — derive H100's peak numbers and the arithmetic intensity it needs.
package main

import "fmt"

type GPU struct {
	Name                 string
	SMs                  int
	TensorFMAPerClkPerSM float64 // dense BF16 FMAs per clock per SM
	ClockGHz             float64 // clock NVIDIA's tensor figures assume
	BandwidthTBs         float64
}

func main() {
	gpus := []GPU{
		{"H100 PCIe", 114, 2048, 1.62, 2.0},
		{"H100 SXM5", 132, 2048, 1.83, 3.35},
		{"H200", 132, 2048, 1.83, 4.8},
	}
	fmt.Println("GPU          BF16 TF   FP8 TF   balance BF16   balance FP8  (FLOP per byte)")
	for _, g := range gpus {
		bf16 := float64(g.SMs) * g.TensorFMAPerClkPerSM * 2 * g.ClockGHz / 1000 // TFLOP/s
		fp8 := 2 * bf16
		fmt.Printf("%-11s %8.0f %8.0f %14.0f %13.0f\n",
			g.Name, bf16, fp8, bf16/g.BandwidthTBs, fp8/g.BandwidthTBs)
	}

	// Decode at batch 1 multiplies a weight matrix by one vector: 2 FLOPs per weight,
	// and each FP8 weight is 1 byte. Intensity 2 FLOP/byte, far below the balance.
	fmt.Println("\nbatch  intensity (FLOP/byte, FP8 weights)  regime on H100 SXM5")
	for _, b := range []int{1, 8, 64, 256, 512, 1024} {
		ai := 2.0 * float64(b)
		regime := "memory-bound"
		if ai >= 1979/3.35 {
			regime = "compute-bound"
		}
		fmt.Printf("%5d  %35.0f  %s\n", b, ai, regime)
	}
}

The first table reproduces NVIDIA’s 989 and 1,979 TFLOP/s for the SXM5 (and the PCIe card’s 756, which runs at a lower clock). The second shows why decoding needs batching: one user’s token uses the H100 at well under 1% of its FP8 peak, and only around 300 tokens decoded together does the work become compute-bound.

Remember this#

  • H100 = one 814 mm² die, 8 GPCs × 18 SMs, 132 enabled, 4 partitions per SM, one tensor core per partition, 5 HBM3 stacks on an interposer.
  • Spare SMs are fused off for yield; that is normal, not a defect.
  • Hopper’s real innovations were FP8, wgmma, TMA and clusters: asynchronous, tile-level hardware for transformers.
  • H200 is H100 with all six HBM sites filled with HBM3e: same compute, 1.4x the bandwidth, 1.8x the memory.

Try it#

  1. Run hopper.go. Change the H100 SXM5 bandwidth to the H200’s 4.8 TB/s and find the new batch at which decode turns compute-bound.
  2. Using the drawing, estimate how many SMs a 7-way MIG split gives each instance (6.c).
  3. On a machine with an H100, run nvidia-smi -q | grep -i -A2 clocks under load and compare the clock to the 1.83 GHz used above.

Check yourself#

  1. Why does the H100 package need a silicon interposer?
  2. What changed between H100 and H200, and what did not?
  3. Derive 989 TFLOP/s from the SM count and the clock.
  4. Why is a single user’s decode memory-bound on any H100?

Sources#

↑↓ navigate↵ openesc close

100% drag to pan · scroll or pinch to zoom · double-click to zoom in