内存层次
Memory Hierarchy
用 SRAM/DRAM/HBM/磁盘构建多级存储,在速度、容量、成本间取舍。HBM 和统一内存正在重塑 AI 时代的内存架构。
内存层次结构(Memory Hierarchy)利用局部性原理,将不同速度、容量、成本的存储设备组织成金字塔形结构。从上到下:寄存器(~1ns,KB级)→ L1缓存(~1ns,32-64KB)→ L2缓存(~4ns,256KB-1MB)→ L3缓存(~10ns,数MB)→ 主存DRAM(~100ns,数GB)→ HBM(~10ns,数GB-数十GB)→ SSD(~100μs,数TB)→ HDD(~10ms,数TB)。缓存基于时间局部性(最近访问的数据很可能再次访问)和空间局部性(相邻数据很可能被访问)。缓存映射策略包括直接映射、全相联、组相联。替换策略包括 LRU、FIFO、随机替换。TLB(Translation Lookaside Buffer)缓存虚拟地址到物理地址的映射。 HBM(High Bandwidth Memory,高带宽内存)是一种 3D 堆叠的 DRAM 技术,通过硅通孔(TSV)将多层 DRAM 芯片垂直堆叠,并与 GPU/加速器通过 2.5D 封装集成在同一基板上。HBM 提供远超传统 DDR 的带宽:HBM3 可达 800GB/s,HBM3E 可达 1.2TB/s,而 DDR5 仅约 100GB/s。HBM 的延迟略高于 DDR(~10ns vs ~100ns),但带宽优势使其成为 AI 训练和推理的首选内存。 统一内存(Unified Memory)是 NVIDIA CUDA 引入的编程模型,允许 CPU 和 GPU 共享同一虚拟地址空间。程序员无需显式管理 CPU↔GPU 的数据拷贝,系统自动在后台迁移数据。Apple Silicon 的 M 系列芯片从硬件层面实现统一内存架构(UMA):CPU、GPU、NPU 共享同一块高带宽内存池,消除了数据拷贝开销。统一内存简化了编程模型,但数据迁移仍有延迟代价。
CPU 速度远快于内存速度(摩尔定律使 CPU 速度每 18 个月翻倍,而内存速度提升缓慢)。如果每次内存访问都等待 100 个时钟周期,CPU 将大部分时间空闲。缓存通过在 CPU 和主存之间插入快速存储,利用局部性原理将平均访问延迟降低到接近 L1 缓存水平。没有缓存,现代 CPU 的性能将下降 10-100 倍。内存层次是计算机系统中最重要的性能优化手段之一。 AI 工作负载(大模型训练/推理)对内存带宽的需求远超传统计算。一个 70B 参数的模型推理需要每秒读取数十 GB 的权重数据,传统 DDR 内存成为瓶颈。HBM 通过 3D 堆叠和宽总线(1024-bit)提供 TB/s 级带宽,使 GPU 能够喂饱数千个计算核心。统一内存则解决了异构计算的编程复杂性——程序员不再需要手动管理 CPU 和 GPU 之间的数据搬运。
程序员通过内存访问模式间接影响缓存性能。理解内存层次有助于理解:为什么数组按行遍历比按列遍历快(空间局部性);为什么链表遍历比数组慢(缓存不友好);为什么循环展开能提升性能(减少缓存未命中)。性能分析工具(如 perf、cachegrind)可以测量缓存命中率。虚拟内存通过页表和 TLB 实现地址转换,使每个进程拥有独立的地址空间。 HBM 对程序员透明——GPU 自动使用 HBM 作为显存,无需特殊 API。但程序员需要理解 HBM 的带宽限制:AI 推理的性能瓶颈往往是内存带宽而非计算能力(memory-bound)。统一内存通过 cudaMallocManaged 分配,CPU 和 GPU 可直接访问同一指针。但首次访问未驻留数据的页面会触发页面迁移(page fault),产生延迟。Apple Silicon 的统一内存通过硬件一致性协议实现零拷贝,性能优于 CUDA 的统一内存。
Bottom-up:由下层如何构建
本层建立在以下层级之上:
Top-down:向上暴露什么接口
Programmer View:程序员视角
我能操作吗?
通过内存地址访问。高级语言中通过变量、数组、指针间接使用。可通过 prefetch 指令预取数据。GPU 编程中通过 cudaMallocManaged 使用统一内存,HBM 作为 GPU 显存自动使用。
成本模型
| 指标 | 量级 | 备注 |
|---|---|---|
| L1 缓存命中 | ~1 ns(4 周期) | 32-64KB,最快 |
| L2 缓存命中 | ~4 ns(12 周期) | 256KB-1MB |
| L3 缓存命中 | ~10 ns(40 周期) | 数 MB,共享 |
| DDR5 主存访问 | ~100 ns(300 周期) | 带宽 ~100 GB/s |
| HBM3 访问 | ~10 ns | 带宽 800 GB/s - 1.2 TB/s,AI 加速器标配 |
| 统一内存页面迁移 | ~1-10 μs | 首次访问触发 page fault,后续访问接近本地延迟 |
| SSD 访问 | ~100 μs | 比内存慢 1000 倍 |
| HDD 访问 | ~10 ms | 比内存慢 100000 倍 |
常见陷阱
- !缓存未命中(Cache Miss):访问不在缓存中的数据,需等待 100+ 周期从主存加载。热点数据应尽量保持在缓存中
- !假共享(False Sharing):多核修改同一缓存行的不同变量,导致缓存行在核心间频繁传递,性能下降
- !TLB Miss:虚拟地址转换缓存未命中,需遍历页表(多级页表可能需 4 次内存访问),延迟增加
- !HBM 容量限制:HBM 容量远小于 DDR(单卡 80GB vs 服务器数 TB),大模型需要模型并行或量化压缩
- !统一内存的隐式迁移:CUDA 统一内存在 CPU↔GPU 间自动迁移数据,频繁的跨设备访问会产生大量 page fault,性能反而不如显式拷贝
- !内存墙(Memory Wall):AI 推理的性能瓶颈往往是内存带宽而非算力。70B 模型推理需要 ~1.4TB/s 带宽,单卡 HBM 难以满足
GPU 对应表
GPU 不是 CPU 的替代品,而是抽象阶梯的并行分支。每一层抽象在 GPU 上都有对应的实现:
| 层级 | 抽象 | GPU 的对应 |
|---|---|---|
| L0 | 晶体管 | 同样——GPU 由数十亿晶体管构成 |
| L1 | 逻辑门(NAND) | 同样——GPU 的逻辑门规模远超 CPU |
| L2 | ALU | GPU 有海量向量 ALU(CUDA 核心) |
| L3 | 寄存器 / 存储 | GPU 寄存器、共享内存、显存(HBM) |
| L4 | 机器指令 / ISA | CPU ISA + GPU ISA(SASS/GCN) |
| L5 | 计算机体系结构 | CPU 架构 + GPU 架构(SIMT) |
| L6 | 汇编语言 | CPU 汇编 + GPU 汇编(PTX/SASS) |
| L7 | 汇编器 | CPU 汇编器 + GPU 汇编器 |
| L8 | 虚拟机 | JVM/CLR + GPU 运行时(CUDA/OpenCL) |
| L9 | 高级语言 | C/C++/Python + CUDA/OpenCL/SYCL |
| L10 | 编译器 | GCC/LLVM + NVCC/LLVM GPU 后端 |
| L11 | 操作系统 | OS + GPU 驱动 + 命令调度 |
| L12 | 系统库 / 运行时 | libc + cuDNN/cuBLAS/ROCm |
| L13 | 容器 / 编排 | Docker + NVIDIA Container Toolkit + K8s Device Plugin |
| L14 | 云原生应用 | 分布式训练/推理、GPU 池化、MIG/vGPU |
💡 从 L0 到 L3,GPU 和 CPU 共享相同的物理基础;从 L4 开始,两者分道扬镳——CPU 走向复杂的乱序执行和分支预测,GPU 走向 SIMT 和海量并行。到了 L14,两者在云原生层面重新汇合。