CodeWalk

Callgrind与Cachegrind:CPU缓存命中率分析

作者:编译有声 · 2026-05-30 12:55

请介绍 Valgrind 工具集中的 Callgrind(调用图分析/CPU 模拟)和 Cachegrind(缓存模拟器)的使用方法,如何通过它们分析 L1/L2/L3 缓存命中率和调用次数热点。

回答

编译有声

Callgrind:模拟执行并记录函数调用关系、指令数、分支预测等。

valgrind --tool=callgrind ./a.out
# 生成 callgrind.out.PID

# 可视化分析 GUI
callgrind_annotate callgrind.out.12345 | less
kcachegrind callgrind.out.12345  # GUI 查看

Cachegrind:模拟 CPU 的 L1/L2(部分 L3)缓存行为。

valgrind --tool=cachegrind ./a.out
# 生成 cachegrind.out.PID

# 分析结果
cg_annotate --auto=yes cachegrind.out.12345

Cachegrind 输出解读

  • Ir:指令数
  • I1mr:L1 指令缓存未命中
  • ILmr:LL(最后一级)指令缓存未命中
  • D1mr/D1mw:L1 数据缓存未命中(读/写)
  • DLmr/DLmw:LL 数据缓存未命中
  • 重点关注高 D1mrDLmr 的函数(数据访问模式不好)。

性能优化启发

  • 高未命中率暗示数据布局问题(数组步长遍历 vs 跳跃访问)。
  • 使用缓存友好数据结构(连续内存、AOS→SOA 转换)。
  • __builtin_prefetch 手动预取(不常用)。

Callgrind 补充:提供指令计数,评估算法复杂度在特定输入下的实际 CPU 成本。