这是我的要求,我知道某些算法很好地利用了Cache,有些算法没有,有些算法比其他算法在特定数据集上做得更多,等等。我想看看并分析自己发生的事情。< / p>
所以我想知道是否有一种方法可以让我知道如何读取某个内存/变量,即它是来自缓存,还是存在缓存未命中。此外,如果在检索此值等时出现页面错误。
非常感谢!
答案 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 ++语言中的任何内容(我都知道)都无法访问缓存级别的内容。
有各种各样的测量工具,但它们在很大程度上与语言无关。
有一些“规则”可以最大限度地减少缓存和分页问题,但我需要一些时间来考虑一个相当全面的列表。