Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 系统与高性能 / Systems & Performance

计算系统 / Computing Systems

1. 计算系统:计算机如何执行与加速程序

2. 从 C++ 源码到 CPU 执行

3. CPU 流水线、乱序执行与分支预测

4. Cache、一致性、伪共享与 NUMA

5. GPU、SM、Warp 与显存

6. 计算执行模型:程序怎样映射到机器

7. SIMD 与编译器向量化

8. C++ 多线程与 OpenMP

9. CUDA 平台与编程模型

10. CUDA Kernel、内存与性能

11. CPU-GPU 异构流水线

12. MPI 与分布式并行

13. 并行算法模式

14. 性能模型与工具

15. 递进学习项目:从单线程到集群

历史完整正文 / Original Deep Dives

1. 历史完整正文:统一前文章逐篇保留

原体系结构与硬件 / Original Architecture

1. 硬件编程与高性能计算:一张可走通的学习地图 / A Practical Learning Map for Hardware Programming and HPC

2. 计算机体系结构:CPU、内存与 GPU / Computer Architecture: CPUs, Memory, and GPUs

3. 计算机架构基础——为什么 GPU 比 CPU 更快 / Computer Architecture Fundamentals: Why GPUs Outperform CPUs

4. 并行计算理论——30 天训练能优化到多快? / Parallel Computing Theory and the Limits of Training Acceleration

5. GPU 架构深入——上万个核心如何分工协作 / GPU Architecture and Massive Parallel Execution

6. CUDA 编程模型——把矩阵乘法映射到 GPU / The CUDA Programming Model for Mapping Matrix Multiplication to GPUs

7. CUDA 内存管理——百亿参数如何装进显存 / CUDA Memory Management for Large Models

8. CUDA 性能优化——从 30 天缩短到 10 天 / CUDA Performance Optimization

9. CPU 并行编程——OpenMP 与 SIMD 向量化 / CPU Parallel Programming with OpenMP and SIMD

10. HPC 集群与 MPI——多节点分布式训练 / HPC Clusters and MPI for Distributed Training

11. 异构计算——CPU 与 GPU 如何协同工作 / Heterogeneous Computing with CPUs and GPUs

12. 深度学习训练优化实战——从 30 天到 3 天 / Deep Learning Training Optimization from Thirty Days to Three

13. 性能分析工具——找到真正的瓶颈 / Performance Analysis Tools for Finding Real Bottlenecks

14. NPU 全景——昇腾/寒武纪/TPU/苹果生态 / The NPU Landscape: Ascend, Cambricon, TPU, and Apple

15. 未来趋势——2030 年的计算机会是什么形态 / Future Computing Trends Toward 2030

16. 硬件与高性能计算:从“程序为什么慢”开始 / Hardware and HPC Starting from Why Programs Are Slow

原并行计算 / Original Parallel Computing

1. 并行计算:从 SIMD 到 MPI / Parallel Computing from SIMD to MPI

2. 并行计算全景:从晶体管、CPU、GPU 到计算集群 / Parallel Computing from Transistors, CPUs, and GPUs to Clusters

3. 并行计算基础:任务分解、加速比与可扩展性 / Parallel Computing Fundamentals: Decomposition, Speedup, and Scalability

4. 处理器体系结构:从指令流水线到多核芯片 / Processor Architecture from Instruction Pipelines to Multicore Chips

5. CPU 并行:多线程、SIMD、Cache 一致性与 NUMA / CPU Parallelism with Threads, SIMD, Cache Coherence, and NUMA

6. 内存层次:Cache、带宽、局部性与一致性 / Memory Hierarchies, Bandwidth, Locality, and Coherence

7. GPU 体系结构:SIMT、Warp、SM 与吞吐优先设计 / GPU Architecture with SIMT, Warps, and Streaming Multiprocessors

8. CUDA 编程模型:Thread、Block、Grid 与内存协作 / CUDA Threads, Blocks, Grids, and Cooperative Memory Access

9. 并行算法模式:Map、Reduce、Scan、Stencil 与任务图 / Parallel Patterns: Map, Reduce, Scan, Stencil, and Task Graphs

10. 异构计算:CPU、GPU、NPU 如何协同工作 / Heterogeneous Computing with CPUs, GPUs, and NPUs

11. 分布式并行:MPI、集合通信、RDMA 与多机多卡 / Distributed Parallelism with MPI, Collective Communication, and RDMA

12. 性能工程:测量、Roofline、瓶颈定位与优化闭环 / Performance Engineering with Measurement, Roofline, and Bottleneck Analysis

13. 并行计算实战:AI、CAE、图像与科学计算 / Parallel Computing for AI, CAE, Imaging, and Scientific Computing

14. 并行计算实践路线:从单核优化到多机多卡 / A Parallel Computing Project Path from Single-Core to Multi-Node GPUs

本页目录

内存层次:Cache、带宽、局部性与一致性 / Memory Hierarchies, Bandwidth, Locality, and Coherence ​

📅 创建时间:2026-07-20 🏷️ 标签:#内存层次 #Cache #带宽 #局部性 #一致性 📚 前置知识:[[03-cpu-parallelism]] 📚 相关知识:[[/02-systems-and-performance/02-computer-architecture-and-hardware/01-computer-architecture-basics]] [[/02-systems-and-performance/02-computer-architecture-and-hardware/05-cuda-kernel-and-memory]]


1. 为什么数据移动决定性能 ​

计算单元速度远高于主存。处理器可以在等待一次内存访问期间执行许多算术操作。

典型层次如下:

text
寄存器      最快、最小、线程私有
L1 Cache    很快、每核或局部共享
L2 Cache    较大、延迟更高
L3 Cache    多核共享、容量更大
主存 DRAM   容量大、延迟高
SSD/网络    更慢,但容量或范围更大
1
2
3
4
5
6

从上往下,容量增加,访问速度下降。


2. 时间局部性与空间局部性 ​

时间局部性 ​

最近访问过的数据很可能再次访问。

cpp
for (int k = 0; k < 100; ++k)
    sum += value; // value 被反复使用
1
2

空间局部性 ​

访问某个地址后,很可能继续访问附近地址。

cpp
for (int i = 0; i < n; ++i)
    sum += a[i]; // 连续访问
1
2

Cache 通常以 Cache Line 为单位搬运,例如 64 字节。连续访问能够充分利用一次搬运的数据。


3. 行优先矩阵的访问顺序 ​

C/C++ 二维数组按行连续存储:

cpp
// 友好:连续访问
for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
        sum += a[i][j];

// 不友好:跨行跳跃
for (int j = 0; j < n; ++j)
    for (int i = 0; i < n; ++i)
        sum += a[i][j];
1
2
3
4
5
6
7
8
9

两段代码计算量相同,但第二段可能产生更多 Cache Miss。


4. 分块提高数据复用 ​

矩阵乘法直接访问大矩阵时,数据可能在再次使用前已被逐出 Cache。分块把问题切成能放入 Cache 的小块:

text
大矩阵
┌────┬────┬────┐
│块00│块01│块02│
├────┼────┼────┤
│块10│块11│块12│
└────┴────┴────┘
1
2
3
4
5
6

GPU 的 Shared Memory 分块和 CPU 的 Cache Blocking,本质都是主动提高局部性。


5. 延迟与带宽 ​

  • 延迟:一次访问从发出到返回需要多久
  • 带宽:单位时间最多能搬运多少数据

链表随机访问常受延迟限制,向量连续扫描更容易接近带宽上限。

算术强度 ​

text
算术强度 = 浮点运算次数 / 内存传输字节数
1

向量加法读取两个数组并写入一个数组,每个元素只做一次加法,算术强度很低。矩阵乘法可以重复使用数据,算术强度较高。


6. Cache 一致性 ​

多个 CPU 核心可能缓存同一个内存地址。如果一个核心修改数据,其他核心的旧副本必须失效或更新。

一致性协议保证最终看到正确数据,但会产生:

  • Cache Line 在核心间转移
  • 共享写入导致一致性流量
  • 原子变量成为热点
  • 伪共享导致无意义失效

因此“共享内存编程方便”不代表共享数据是免费的。


7. 内存一致性模型 ​

编译器和 CPU 为提高性能可能重排指令。多线程程序不能只根据源代码顺序推断其他线程观察到的顺序。

C++ 使用原子操作和内存序建立线程间关系:

cpp
data = 42;
ready.store(true, std::memory_order_release);

if (ready.load(std::memory_order_acquire)) {
    use(data); // acquire/release 建立可见性关系
}
1
2
3
4
5
6

除非确实在实现底层并发结构,否则优先使用 Mutex、并发容器和成熟库,避免自行组合复杂内存序。


8. 内存优化顺序 ​

  1. 减少不必要的数据和拷贝。
  2. 让访问尽量连续。
  3. 选择紧凑的数据布局。
  4. 通过分块增加复用。
  5. 减少跨线程共享写入。
  6. 检查 NUMA 和设备间传输。
  7. 使用硬件计数器验证 Cache Miss 和带宽。

历史内存层次补充 ​

本页保留课程合并前的内存层次说明。

当前文章扩展了 Working Set、TLB、NUMA、GPU 内存和实验方法。

Working Set ​

阶段内频繁访问的数据决定实际 Cache 压力。

总文件或总堆大小不能替代 Working Set。

Cache Line ​

Cache 以 Line 为搬运单位。

字段布局决定有效字节比例。

Miss 分类 ​

  • 首次;
  • 容量;
  • 冲突;
  • 一致性。

分类需要结合访问和计数器。

延迟 ​

依赖访问受单次延迟限制。

Pointer Chasing 难以提高并行请求数。

带宽 ​

流式访问更接近带宽限制。

线程增加到带宽饱和后不会继续线性提升。

预取 ​

连续模式适合硬件预取。

随机和数据依赖访问难以预取。

AoS/SoA ​

AoS 适合完整对象访问。 SoA 适合同字段批量与 SIMD。

布局必须看全部阶段。

TLB ​

TLB 缓存页转换。

Huge Page 有转换收益与内存管理代价。

Page Fault ​

首次映射、文件页、COW 和 Swap 代价不同。

区分 Minor 与 Major Fault。

NUMA ​

本地与远端内存路径不同。

首次触碰和亲和性影响放置。

False Sharing ​

不同变量位于同一 Line 也会争用。

分片和对齐需要 Profile 证据。

分配器 ​

小对象产生碎片、锁和元数据。

Arena 与 Pool 适合明确生命周期。

GPU Register ​

Register 快但有限。

过多寄存器可能降低驻留线程。

GPU Shared Memory ​

Block 内共享,适合 Tile 和复用。

需要同步和避免 Bank Conflict。

GPU Global Memory ​

容量大,访问应合并并提高复用。

Unified Memory ​

地址统一,物理页面仍会迁移。

Timeline 用于观察 Fault 和 Migration。

Host Pinned Memory ​

支持高效异步传输。

过量会影响系统,必须预算。

测量工具 ​

  • VTune Memory Access;
  • WPA Memory/Heap;
  • Linux Perf;
  • 带宽计数器;
  • NUMA 工具;
  • Nsight Systems;
  • Nsight Compute;
  • 分配 Profile。

实验记录 ​

保存:

  • 输入;
  • 工作集;
  • 布局;
  • 线程;
  • 亲和性;
  • 页面策略;
  • 字节估算;
  • 实际带宽;
  • Cache/TLB;
  • 正确性。

历史参数边界 ​

Cache 容量、Line、TLB 和带宽随平台变化。

旧阈值不能直接用于当前硬件。

当前课程映射 ​

当前文章增加:

  • Working Set;
  • Write Allocate;
  • MLP;
  • TLB/Page Fault;
  • NUMA 策略;
  • GPU 内存;
  • 实验和完成标准。

阅读完成标准 ​

应能:

  • 估算 Working Set;
  • 区分延迟和带宽;
  • 解释 Cache/TLB;
  • 识别 False Sharing;
  • 分析 NUMA;
  • 选择数据布局;
  • 解释 GPU 内存;
  • 设计测量。

归档复现清单 ​

  • 来源提交;
  • CPU/GPU;
  • 内存拓扑;
  • 编译器;
  • 数据布局;
  • 输入规模;
  • 线程与亲和性;
  • 页面大小;
  • 预热状态;
  • Cache/TLB 事件;
  • 带宽;
  • Page Fault;
  • NUMA 远端流量;
  • 原始样本;
  • 正确性;
  • 当前平台差异。

历史结果无法复现时,应保留原环境说明而不是重新解释为当前保证。

核心总结 ​

  • 现代并行计算经常受数据移动而不是计算能力限制。
  • 局部性决定 Cache 的有效程度。
  • 分块是 CPU、GPU 和科学计算中的通用优化思想。
  • 多核共享数据会触发一致性成本。
  • 必须同时分析延迟、带宽和算术强度。

下一篇:[[05-gpu-architecture]]

最后更新于:

Pager
上一篇5. CPU 并行:多线程、SIMD、Cache 一致性与 NUMA / CPU Parallelism with Threads, SIMD, Cache Coherence, and NUMA
下一篇7. GPU 体系结构:SIMT、Warp、SM 与吞吐优先设计 / GPU Architecture with SIMT, Warps, and Streaming Multiprocessors

持续记录,持续成长

Copyright © Tidenflow