L5·

内存层次

Memory Hierarchy

核心抽象存储与缓存

用 SRAM/DRAM/HBM/磁盘构建多级存储,在速度、容量、成本间取舍。HBM 和统一内存正在重塑 AI 时代的内存架构。

学习进度:
What

内存层次结构(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 共享同一块高带宽内存池,消除了数据拷贝开销。统一内存简化了编程模型,但数据迁移仍有延迟代价。

Why

CPU 速度远快于内存速度(摩尔定律使 CPU 速度每 18 个月翻倍,而内存速度提升缓慢)。如果每次内存访问都等待 100 个时钟周期,CPU 将大部分时间空闲。缓存通过在 CPU 和主存之间插入快速存储,利用局部性原理将平均访问延迟降低到接近 L1 缓存水平。没有缓存,现代 CPU 的性能将下降 10-100 倍。内存层次是计算机系统中最重要的性能优化手段之一。 AI 工作负载(大模型训练/推理)对内存带宽的需求远超传统计算。一个 70B 参数的模型推理需要每秒读取数十 GB 的权重数据,传统 DDR 内存成为瓶颈。HBM 通过 3D 堆叠和宽总线(1024-bit)提供 TB/s 级带宽,使 GPU 能够喂饱数千个计算核心。统一内存则解决了异构计算的编程复杂性——程序员不再需要手动管理 CPU 和 GPU 之间的数据搬运。

How

程序员通过内存访问模式间接影响缓存性能。理解内存层次有助于理解:为什么数组按行遍历比按列遍历快(空间局部性);为什么链表遍历比数组慢(缓存不友好);为什么循环展开能提升性能(减少缓存未命中)。性能分析工具(如 perf、cachegrind)可以测量缓存命中率。虚拟内存通过页表和 TLB 实现地址转换,使每个进程拥有独立的地址空间。 HBM 对程序员透明——GPU 自动使用 HBM 作为显存,无需特殊 API。但程序员需要理解 HBM 的带宽限制:AI 推理的性能瓶颈往往是内存带宽而非计算能力(memory-bound)。统一内存通过 cudaMallocManaged 分配,CPU 和 GPU 可直接访问同一指针。但首次访问未驻留数据的页面会触发页面迁移(page fault),产生延迟。Apple Silicon 的统一内存通过硬件一致性协议实现零拷贝,性能优于 CUDA 的统一内存。

Bottom-up:由下层如何构建

本层建立在以下层级之上:

Top-down:向上暴露什么接口

缓存虚拟地址局部性HBM统一内存

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
L2ALUGPU 有海量向量 ALU(CUDA 核心)
L3寄存器 / 存储GPU 寄存器、共享内存、显存(HBM)
L4机器指令 / ISACPU 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,两者在云原生层面重新汇合。