我需要在一堆关于内存层次效率的假设中评估C ++函数所花费的时间(例如:当我们在读取数组的一部分时遇到缓存未命中,缓存命中或页面错误时所花费的时间),所以我想要一些库让我计算缓存未命中/页面错误,以便能够自动生成性能摘要。
我知道有一些像cachegrind这样的工具会给出一些关于给定应用程序执行的相关统计信息,但是我想要一个库,正如我已经说过的那样。
编辑哦,我忘了:我正在使用Linux而且我对可移植性不感兴趣,这是一种学术性的东西。
欢迎任何建议!
答案 0 :(得分:5)
最新的CPU(AMD和Intel)都有性能监视器寄存器,可用于此类工作。对于英特尔,它们包含在程序员参考手册第3B卷第30章中。对于AMD,它位于BIOS和内核开发人员指南中。
无论哪种方式,您都可以计算缓存命中,缓存未命中,内存请求,数据预取等内容。它们具有非常特定的选择器,因此您可以获得(例如)L2缓存上的读取次数填充L1指令高速缓存中的行(同时仍然排除L2读取以填充L1数据高速缓存中的行)。
有一个Linux内核模块可以访问MSR(特定于模型的寄存器)。另外,我不知道它是否可以访问性能监视器寄存器,但我希望它可能会这样做。
答案 1 :(得分:4)
现在看来我正在寻找的是perf_event_open。
它允许您执行有趣的操作,例如初始化/启用/禁用某些性能计数器,以便随后通过统一且直观的API获取其值(它为您提供了一个特殊的文件描述符,其中包含一个包含先前请求的信息的结构)。 p>
这是一个仅限Linux的解决方案,功能因内核版本而异,所以要小心:)
答案 2 :(得分:3)
英特尔VTune 是一款性能调优工具,可以满足您的要求;
当然,它可以与英特尔处理器一起使用,因为它访问内部处理器计数器,如Jerry Coffin
所述,因此这可能不适用于AMD处理器。
它暴露了数百个计数器,如缓存命中/未命中,分支预测率等。它的真正问题是了解要检查的计数器;)
答案 3 :(得分:1)
缓存未命中不能轻易计算。大多数工具或分析器通过将内存访问重定向到提供此功能的函数来模拟内存访问。这意味着这些工具可以在所有进行内存访问的地方检测代码,并使代码运行缓慢。这不是我的意图。
但是,根据硬件的不同,您可能还有其他一些可能性。但即使是这种情况,操作系统也应该支持它(因为否则你会获得系统全局统计数据而不是与进程或线程相关的统计数据)
编辑:我可以找到这篇可能对您有帮助的文章:http://lwn.net/Articles/417979/