《Performance Analysis and Tuning on Modern CPUs》(Denis Bakhvalov)优化章节(第 7–11 章)的 C++ 示例代码,配有中文注释,帮助读者将书中抽象概念与实际代码对应起来。
书籍原文免费获取:easyperf.net
patmc_cpp/
├── ch07_frontend/ # 第7章:CPU 前端优化
│ ├── 01_basic_block_placement.cpp # 基本块放置:__builtin_expect / [[likely]]
│ ├── 02_basic_block_alignment.cpp # 基本块对齐:alignas(64) / cache line
│ └── 03_function_splitting.cpp # 函数冷热分离:[[gnu::cold]] / noinline
│
├── ch08_backend/
│ ├── memory_bound/ # 第8章:内存瓶颈优化
│ │ ├── 01_sequential_access.cpp # 顺序访问 & AoS vs SoA
│ │ ├── 02_data_packing.cpp # 位域压缩 & 结构体成员重排
│ │ ├── 03_alignment_padding.cpp # 数据对齐 & false sharing 预防
│ │ ├── 04_prefetch.cpp # 显式内存预取 __builtin_prefetch
│ │ └── 05_loop_tiling.cpp # 循环分块(矩阵乘法 tiling)
│ └── core_bound/ # 第8章:计算瓶颈优化
│ ├── 01_inlining.cpp # 函数内联:always_inline vs noinline
│ ├── 02_loop_transformations.cpp # LICM / 展开 / 强度削减 / unswitching
│ ├── 03_loop_interchange.cpp # 循环交换(cache stride 优化)
│ ├── 04_loop_fusion.cpp # 循环合并与分裂
│ └── 05_vectorization.cpp # 向量化:__restrict__ / pragma / ffast-math
│
├── ch09_speculation/ # 第9章:消除错误分支预测
│ ├── 01_lookup_table.cpp # 查找表替换 if-else 分支
│ └── 02_predication.cpp # 无分支代码(CMOV)& 二分查找权衡
│
├── ch10_other/ # 第10章:其他优化手段
│ ├── 01_constexpr.cpp # 编译期计算:constexpr 筛质数 & CRC32 表
│ ├── 02_intrinsics.cpp # SIMD 内建函数(SSE x86 / NEON ARM 双路)
│ └── 03_denormals.cpp # 非规格化浮点检测 & FTZ/DAZ 模式
│
└── ch11_multithreaded/ # 第11章:多线程优化
├── 01_true_sharing.cpp # 真实共享:atomic vs thread_local
└── 02_false_sharing.cpp # 伪共享:alignas(64) 消除 cache line 抖动
| 文件 |
优化技术 |
关键 API |
01_basic_block_placement |
热路径走 fall-through,冷路径走 taken |
__builtin_expect, [[likely]], [[unlikely]] |
02_basic_block_alignment |
热循环对齐到 64 字节 cache line |
alignas(64), -falign-loops |
03_function_splitting |
把冷代码提取为独立函数,远离热代码 |
[[gnu::cold]], [[gnu::hot]], noinline |
| 文件 |
优化技术 |
核心原理 |
01_sequential_access |
行优先访问 / SoA 布局 |
空间局部性,cache line 利用率 |
02_data_packing |
位域 + 结构体重排 |
减少内存带宽,消除编译器 padding |
03_alignment_padding |
alignas(64) |
防止跨 cache line,SIMD 对齐要求 |
04_prefetch |
__builtin_prefetch |
隐藏随机访问的内存延迟 |
05_loop_tiling |
矩阵乘法分块 |
时间局部性,L2 cache 工作集适配 |
| 文件 |
优化技术 |
核心原理 |
01_inlining |
强制 / 阻止内联 |
消除 call/ret 开销,开启后续优化 |
02_loop_transformations |
LICM / 展开 / 强度削减 / unswitching |
减少循环税,提升 ILP |
03_loop_interchange |
交换嵌套循环顺序 |
内层循环连续访问,消除大 stride |
04_loop_fusion |
循环合并 & 分裂 |
时间局部性 vs 向量化友好性 |
05_vectorization |
SIMD 自动向量化控制 |
__restrict__ 消除别名,pragma 强制 |
| 文件 |
优化技术 |
适用场景 |
01_lookup_table |
查找表替换 if-else |
值域小、输入随机分布 |
02_predication |
三元运算符触发 CMOV |
小数组/高频 misprediction(大数组慎用) |
| 文件 |
优化技术 |
关键点 |
01_constexpr |
编译期计算 |
constexpr 函数 + static_assert 验证 |
02_intrinsics |
SIMD 内建函数 |
x86/SSE ↔ ARM/NEON 跨平台对比 |
03_denormals |
非规格化浮点 |
FP_ASSIST 开销,FTZ/DAZ 修复 |
| 文件 |
优化技术 |
MESI 协议视角 |
01_true_sharing |
thread_local 减少共享操作 |
atomic 每次触发总线事务 |
02_false_sharing |
alignas(64) 隔离 cache line |
不同线程的变量不共享 cache line |
依赖: CMake ≥ 3.14,C++17 编译器(GCC ≥ 7 / Clang ≥ 5),支持 x86 或 ARM(Apple Silicon)
git clone https://github.com/xuhao77/patmc-cpp-examples.git
cd patmc-cpp-examples
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
运行某个示例:
./build/ch09_speculation/ch09_01_lookup
./build/ch11_multithreaded/ch11_02_false_sharing
- x86_64:
ch10/02_intrinsics 使用 SSE 内建函数(_mm_add_ps 等)
- ARM / Apple Silicon:自动切换为 NEON 内建函数(
vaddq_f32 等)
- 所有示例已在 Apple M 系列芯片上测试通过