Skip to content

Repository files navigation

patmc-cpp-examples

《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 抖动

各章核心概念速查

第7章:CPU 前端优化

文件 优化技术 关键 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

第8章:CPU 后端优化(内存瓶颈)

文件 优化技术 核心原理
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 工作集适配

第8章:CPU 后端优化(计算瓶颈)

文件 优化技术 核心原理
01_inlining 强制 / 阻止内联 消除 call/ret 开销,开启后续优化
02_loop_transformations LICM / 展开 / 强度削减 / unswitching 减少循环税,提升 ILP
03_loop_interchange 交换嵌套循环顺序 内层循环连续访问,消除大 stride
04_loop_fusion 循环合并 & 分裂 时间局部性 vs 向量化友好性
05_vectorization SIMD 自动向量化控制 __restrict__ 消除别名,pragma 强制

第9章:消除错误分支预测

文件 优化技术 适用场景
01_lookup_table 查找表替换 if-else 值域小、输入随机分布
02_predication 三元运算符触发 CMOV 小数组/高频 misprediction(大数组慎用)

第10章:其他优化手段

文件 优化技术 关键点
01_constexpr 编译期计算 constexpr 函数 + static_assert 验证
02_intrinsics SIMD 内建函数 x86/SSE ↔ ARM/NEON 跨平台对比
03_denormals 非规格化浮点 FP_ASSIST 开销,FTZ/DAZ 修复

第11章:多线程优化

文件 优化技术 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_64ch10/02_intrinsics 使用 SSE 内建函数(_mm_add_ps 等)
  • ARM / Apple Silicon:自动切换为 NEON 内建函数(vaddq_f32 等)
  • 所有示例已在 Apple M 系列芯片上测试通过

参考

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages