5.3.2. 使用 Cachegrind 简要概述缓存使用

Cachegrind 模拟您的程序与机器缓存等级和(可选)分支预测单元的互动。它跟踪模拟的一级指令和数据缓存的用量以便探测不良代码与这一级缓存的互动;最高一级,可以是二级或者三级缓存,用来跟踪对主内存的访问。因此,使用 Cachegrind 运行的程序速度比正常运行时要慢 20-100 倍。
要运行 Cachegrind 请执行以下命令,使用您要用 Cachegrind 简要描述的程序替换 program
# valgrind --tool=cachegrind program
Cachegrind 可以为整个程序以及该程序中的每个功能收集统计数据:
  • 一级指令缓存读取(或者执行的指令)和读取缺失,最后一级缓存指令读取缺失;
  • 数据缓存读取(或者内存读取),读取缺失,以及最高一级缓存数据读取缺失;
  • 数据缓存写入(或者内存写入),写ur缺失,以及最高一级缓存数据写入缺失;
  • 已执行和无法预测的条件分支;以及
  • 已执行和无法预测的间接分支。
Cachegrind 输出控制台的这些统计数据信息小结,并在文件(默认为 cachegrind.out.pid,其中pid 为您运行 Cachegrind 的程序的进程 ID)中写入更详细的配置信息。该文件可由 cg_annotate 进行进一步的处理,比如:
# cg_annotate cachegrind.out.pid

注意

cg_annotate 可以输出 120 字符以上,具体要看路径的长度。要让输出结果更清晰、易读,我们建议您在执行上述命令前将终端窗口至少调整到这个宽度。
您还可以比较 Cachegrind 生成的概述文件,将其简化为更改前后的图标对比图。要这样做请使用 cg_diff 命令,使用最初的概述输出文件替换 first,并使用随后的概述输出文件替换 second
# cg_diff first second
这个命令提供合并的输出文件,您可以使用 cg_annotate 查看更详细的结果。
Cachegrind 支持大量选项注重其输出结果。有些可用选项为:
--I1
指定大小,关联性以及一级指令缓存的块大小,以逗号分开:--I1=size,associativity,line size
--D1
指定大小,关联性以及一级数据缓存的块大小,以逗号分开:--D1=size,associativity,line size
--LL
指定大小,关联性以及最后一级指令缓存的块大小,以逗号分开:--LL=size,associativity,line size
--cache-sim
启用或者禁用缓存访问和缺失计数集合。默认值为 yes(启用)。
注:禁用这个选项和 --branch-sim 选项让 Cachegrind 误信息可以收集。
--branch-sim
启用或者禁用分支指令和无法预测计数集合。默认将其设定为 no(禁用),因为它可让 Cachegrind 延缓 25%。
注:禁用这个选项和 --cache-sim 选项让 Cachegrind 误信息可以收集。
选项完整列表请参考 /usr/share/doc/valgrind-version/valgrind_manual.pdf 中的文档。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。