高速缓存命中/错过C / C ++程序中的值

时间:2011-07-31 01:08:23

标签: c++ c performance profiling

这是我的要求,我知道某些算法很好地利用了Cache,有些算法没有,有些算法比其他算法在特定数据集上做得更多,等等。我想看看并分析自己发生的事情。< / p>

所以我想知道是否有一种方法可以让我知道如何读取某个内存/变量,即它是来自缓存,还是存在缓存未命中。此外,如果在检索此值等时出现页面错误。

非常感谢!

4 个答案:

答案 0 :(得分:7)

如果您真的想知道缓存何时出现/丢失,现代处理器都有性能计数器,您可以将其用于此目的。我已将它们广泛用于学术研究。使用它们的最简单方法是perfmon2。 Perfmon2既有一个可以链接到程序中的库,也有一个独立程序可以监视现有程序。例如,这是独立程序记录所有1级数据缓存读取请求和未命中:

pfmon -eL1D_CACHE_LD:MESI,L1D_CACHE_LD:I_STATE your_program

作为参考,this document的附录A(PDF)列出了英特尔关于可用硬件计数器的文档。

答案 1 :(得分:4)

我会尝试使用valgrind cachegrind tool,它可以打印带注释的源代码行,其中包含该行缓存的命中/未命中数。

答案 2 :(得分:1)

我不知道AMD CodeAnalyst是否可以显示该级别的粒度,但检查不会有什么坏处。

答案 3 :(得分:0)

取决于您运行的特定编译器,操作系统和处理器的特定型号。 C / C ++语言中的任何内容(我都知道)都无法访问缓存级别的内容。

有各种各样的测量工具,但它们在很大程度上与语言无关。

有一些“规则”可以最大限度地减少缓存和分页问题,​​但我需要一些时间来考虑一个相当全面的列表。