Skip to content
VoidIndex - Alexander Lee
Go back

NVIDIA Data Center GPUs from Pascal to Blackwell

Edit page

From P100 to B200, NVIDIA grew dense FP16 matrix throughput about 100× (21 → 2,250 TFLOPS), while memory bandwidth grew only about 11× (0.73 → 8 TB/s). Every generation spends most of its new transistors on Tensor Cores running ever lower precision, plus more memory and faster links to feed them [1][5].

Key points

Specs

SXM versions, dense Tensor Core numbers (no sparsity) [1][2][3][4][6].

How the key specs changed:

xychart-beta
  title "Dense FP16 Tensor (TFLOPS)"
  x-axis [P100, V100, A100, H100, B200]
  y-axis "TFLOPS" 0 --> 2400
  line [21.2, 125, 312, 989, 2250]

Compute grew about 100×, with the biggest jump at Volta when Tensor Cores arrived, then roughly 2–3× every generation.

xychart-beta
  title "Tensor Cores (total)"
  x-axis [P100, V100, A100, H100, B200]
  y-axis "Cores" 0 --> 700
  line [0, 640, 432, 528, 592]

The Tensor Core count actually dropped after V100 — each newer core is much wider, so speed comes from what each core does per clock, not from having more of them.

xychart-beta
  title "Memory bandwidth (TB/s)"
  x-axis [P100, V100, A100, H100, B200]
  y-axis "TB/s" 0 --> 8
  line [0.73, 0.9, 2.0, 3.35, 8]

Bandwidth grew only about 11×, far slower than compute, which is why newer GPUs lean on bigger caches and lower precision.

xychart-beta
  title "Memory capacity (GB)"
  x-axis [P100, V100, A100, H100, B200]
  y-axis "GB" 0 --> 200
  line [16, 32, 80, 80, 180]

Capacity grew about 11×, stalled at 80 GB from A100 to H100, then more than doubled with B200's eight HBM3e stacks.

xychart-beta
  title "NVLink bandwidth (GB/s)"
  x-axis [P100, V100, A100, H100, B200]
  y-axis "GB/s" 0 --> 2000
  line [160, 300, 600, 900, 1800]

NVLink roughly doubled each generation, growing about 11×, to keep pace with multi-GPU training and inference.

xychart-beta
  title "Transistors (billions)"
  x-axis [P100, V100, A100, H100, B200]
  y-axis "Billions" 0 --> 220
  line [15.3, 21.1, 54.2, 80, 208]

Transistors grew about 14×; B200 jumps 2.6× over H100 by putting two dies in one package instead of a smaller process.

xychart-beta
  title "TDP (W)"
  x-axis [P100, V100, A100, H100, B200]
  y-axis "W" 0 --> 1100
  line [300, 300, 400, 700, 1000]

Power stayed at 300 W for two generations, then more than tripled to 1,000 W, pushing data centers toward liquid cooling.

Full numbers:

P100V100A100H100B200
ArchitecturePascalVoltaAmpereHopperBlackwell
Year20162017202020222024
ProcessTSMC 16nmTSMC 12nmTSMC 7nmTSMC 4NTSMC 4NP
Transistors15.3B21.1B54.2B80B208B (2 dies)
SMs enabled5680108132148
FP32 cores / SM646464128128
CUDA cores (FP32, total)3,5845,1206,91216,89618,944*
Tensor Core gen—1st3rd4th5th
Tensor Cores / SM—8444
Tensor Cores (total)—640432528592*
Tensor Core precisions—FP16FP64, TF32, BF16, FP16, INT8, INT4FP64, TF32, BF16, FP16, FP8, INT8FP64, TF32, BF16, FP16, FP8, FP6, FP4, INT8
FP64 (TFLOPS)5.37.89.7 (19.5 Tensor)34 (67 Tensor)37
Dense FP16 (TFLOPS)21.21253129892,250
Memory16 GB HBM216/32 GB HBM240/80 GB HBM2e80 GB HBM3180 GB HBM3e
Bandwidth0.73 TB/s0.9 TB/s2.0 TB/s3.35 TB/s8 TB/s
L2 cache4 MB6 MB40 MB50 MBnot published
NVLink (total)160 GB/s300 GB/s600 GB/s900 GB/s1,800 GB/s
TDP300 W300 W400 W700 W1,000 W

P100's FP16 number comes from its regular cores, not Tensor Cores. *B200 core counts are derived from 148 SMs × per-SM counts; NVIDIA doesn't list them directly.

GPU structure

All five generations share the same hierarchy. Only the counts and the units inside the SM change.

flowchart TB
  GPU["GPU"] --> GPC["GPC (graphics processing cluster)"]
  GPC --> TPC["TPC (texture processing cluster)"]
  TPC --> SM["SM ×2"]
  SM --> PB["Processing block ×4 (×2 on Pascal)"]
  PB --> U["Warp scheduler · registers · FP32 / FP64 / INT32 · Tensor Core"]
  GPU --> L2["L2 cache (shared by all SMs)"]
  L2 --> MEM["HBM memory"]

Pascal — P100

flowchart TB
  subgraph SM["Pascal SM (GP100)"]
    direction TB
    B1["Block A: warp scheduler · 32 FP32 · 16 FP64"]
    B2["Block B: warp scheduler · 32 FP32 · 16 FP64"]
    RF["Register file 256 KB"]
    SH["Shared memory 64 KB"]
  end
  SM --> L2["L2 4 MB"] --> HBM["HBM2 16 GB · 732 GB/s"]
  L2 --> NV["NVLink 1 · 4 links · 160 GB/s"]

Architecture

The GP100 SM has 64 FP32 cores split into two processing blocks, half as many cores per SM as Maxwell, so each core gets more registers and shared memory. FP64 runs at half the FP32 rate, which made it a strong HPC chip [1].

What changed

Volta — V100

flowchart TB
  subgraph SM["Volta SM (GV100)"]
    direction TB
    subgraph PB["Processing block ×4"]
      S["Warp scheduler"]
      F["16 FP32 · 8 FP64 · 16 INT32"]
      T["2 Tensor Cores"]
    end
    L1["L1 + shared memory 128 KB"]
  end
  SM --> L2["L2 6 MB"] --> HBM["HBM2 · 900 GB/s"]
  L2 --> NV["NVLink 2 · 6 links · 300 GB/s"]

Architecture

Back to four processing blocks per SM. Each block has 2 Tensor Cores (8 per SM), and each Tensor Core does a 4×4×4 FP16 matrix multiply with FP32 accumulate every clock. L1 and shared memory are merged into one 128 KB pool [2].

What changed

Ampere — A100

flowchart TB
  subgraph SM["Ampere SM (GA100)"]
    direction TB
    subgraph PB["Processing block ×4"]
      S["Warp scheduler"]
      F["16 FP32 · 8 FP64 · 16 INT32"]
      T["1 Tensor Core (3rd gen)"]
    end
    L1["L1 + shared memory 192 KB"]
    AC["Async copy: HBM → shared"]
  end
  SM --> L2["L2 40 MB"] --> HBM["HBM2e 80 GB · 2 TB/s"]
  L2 --> NV["NVLink 3 · 12 links · 600 GB/s"]
  GPU["A100"] -.-> MIG["MIG: up to 7 instances"]

Architecture

One Tensor Core per block, but each is 4× wider than Volta's, so per-SM throughput doubles. Shared memory grows to 192 KB, and a new async copy instruction moves data from global memory into shared memory without passing through registers [3].

What changed

Hopper — H100

flowchart TB
  subgraph CL["Thread block cluster (up to 16 SMs)"]
    direction LR
    subgraph SM["Hopper SM (GH100)"]
      direction TB
      subgraph PB["Processing block ×4"]
        S["Warp scheduler"]
        F["32 FP32 · 16 FP64 · 16 INT32"]
        T["1 Tensor Core (4th gen, FP8)"]
      end
      L1["L1 + shared memory 256 KB"]
      TMA["TMA copy engine"]
    end
    SM2["Other SMs"]
    SM <-- "Distributed shared memory" --> SM2
  end
  CL --> L2["L2 50 MB"] --> HBM["HBM3 80 GB · 3.35 TB/s"]
  L2 --> NV["NVLink 4 · 18 links · 900 GB/s"]

Architecture

FP32 cores per SM double to 128. The Tensor Core doubles again and adds FP8. The TMA (Tensor Memory Accelerator) copies whole tiles between HBM and shared memory from one instruction, so a single thread can issue the copy while others compute. A thread block cluster groups blocks on neighboring SMs that can read each other's shared memory directly [4].

What changed

Blackwell — B200

flowchart LR
  subgraph PKG["B200 package"]
    D1["Die 1 · 104B transistors"] <-- "NV-HBI 10 TB/s" --> D2["Die 2 · 104B transistors"]
  end
  D1 --> M1["HBM3e ×4"]
  D2 --> M2["HBM3e ×4"]
  PKG --> NV["NVLink 5 · 18 links · 1.8 TB/s"]
  subgraph SM["Blackwell SM"]
    direction TB
    T["Tensor Core (5th gen, FP4 / FP6 / FP8)"]
    TM["Tensor memory 256 KB"]
    L1["L1 + shared memory"]
  end
  D1 -.-> SM

Architecture

Each die is about as large as a die can be manufactured, so NVIDIA put two dies in one package, joined by a 10 TB/s link (NV-HBI). Software sees a single GPU with 8 HBM3e stacks. Inside the SM, the 5th-gen Tensor Core reads and writes a new tensor memory (256 KB per SM) instead of registers, which frees registers for other work [5][7].

What changed

Pitfalls

References

  1. NVIDIA Tesla P100 Whitepaper
  2. NVIDIA Tesla V100 GPU Architecture Whitepaper
  3. NVIDIA A100 Tensor Core GPU Architecture Whitepaper
  4. NVIDIA H100 Tensor Core GPU Architecture Whitepaper
  5. NVIDIA Blackwell Architecture Technical Brief
  6. NVIDIA HGX Platform (B200 specs)
  7. CUDA PTX ISA — Tensor Memory

Edit page
Share this post:

Previous Post
vLLM Quantization
Next Post
Open-Source RL Frameworks for LLMs: verl, OpenRLHF, TRL, NeMo RL, ROLL, slime, AReaL