Callgrind与Cachegrind:CPU缓存命中率分析
请介绍 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 数据缓存未命中- 重点关注高
D1mr和DLmr的函数(数据访问模式不好)。
性能优化启发:
- 高未命中率暗示数据布局问题(数组步长遍历 vs 跳跃访问)。
- 使用缓存友好数据结构(连续内存、AOS→SOA 转换)。
__builtin_prefetch手动预取(不常用)。
Callgrind 补充:提供指令计数,评估算法复杂度在特定输入下的实际 CPU 成本。