cachegrind的summary输出是分析结束后在命令行或日志末尾显示的缓存行为宏观统计,包含i1/d1/ll缓存配置、总指令数、ll缺失数及缺失率等关键指标,用于快速评估整体缓存效率,但不提供函数级或行级定位信息。

什么是 Cachegrind 的 summary 输出
Cachegrind 的 summary 是指它在分析结束后,以文本形式打印出的 CPU 缓存行为统计汇总,不是图形界面里的“摘要栏”,而是命令行末尾或日志文件里那几行带数字的统计行。它不描述函数调用路径,只告诉你整个程序运行期间 cache 的宏观表现:总共访问了多少次、命中多少、丢失多少、指令/数据分别如何。
summary 里关键字段含义和典型值
运行 cachegrind --tool=cachegrind ./myapp 后,结尾类似:
I1 cache: 65536 B, 64 B, 16-way associative D1 cache: 32768 B, 64 B, 8-way associative LL cache: 8388608 B, 64 B, 16-way associative Timerange: Basic block 0 to 1234567 Instructions: 123456789 Branches: 12345678 (2.3% not taken) Taken branches: 12045678 (97.7%) Branch mispredictions: 123456 (1.0%) LL misses: 1234567 LL miss rate: 1.0%
重点关注这几项:
-
I1 cache/D1 cache/LL cache:分别是 L1 指令缓存、L1 数据缓存、最后一级(通常是 L3)缓存的配置,影响你对“miss 是否合理”的判断——比如你的 CPU 实际 L1d 是 48KB,但这里显示 32KB,说明没用上硬件真实能力,可能因为模拟限制或程序未触发足够访存 -
Instructions:总执行指令数,用于归一化计算每千条指令的 miss 数(IPC-level 分析) -
LL misses和LL miss rate:最核心指标。> 0.5% 通常值得优化;> 3% 往往意味着严重缓存不友好(如随机内存访问、大 stride 遍历) -
Branch mispredictions:若占比 > 2%,且集中在某段循环或条件分支密集区,可能暗示分支预测器被频繁打乱,需检查 if/else 分布或考虑 __builtin_expect
summary 不告诉你什么,必须配合 callgrind 或 kcachegrind 看
summary 本身没有函数名、行号、调用栈——它只回答“整体有多糟”,不回答“哪一段代码导致的”。比如 LL miss rate: 2.8% 看着高,但你无法知道是 memcpy 还是某个嵌套 for 循环惹的祸。
所以实际调试流程是:
- 先跑
cachegrind --log-file=cg.out ./myapp - 看结尾
summary判断是否值得深挖 - 再用
kcachegrind cg.out打开图形界面,按 “Inclusive LL Misses” 排序,定位 hot 函数和具体指令行 - 注意:kcachegrind 默认显示的是 *inclusive*(含子调用)数据;想看函数自身开销,得切到 “Self” 列
容易忽略的一点:Cachegrind 统计的是模拟执行下的 cache 行为,不等同于真实硬件表现——尤其在多核共享 LLC 场景下,它把 LLC 当作统一资源模拟,而实际中可能有 bank 冲突、prefetch 干扰等未建模因素。别拿它的绝对 miss 数直接对标 perf stat 的结果。











