繁体   English   中英

以编程方式计算缓存故障

[英]Programmatically counting cache faults

我需要在一堆关于内存层次结构效率的假设中评估C ++函数所花费的时间(例如:当我们读取一部分数据时遇到缓存未命中,缓存命中或页面错误时所花费的时间),所以我我希望有一些库可以让我计算缓存未命中/页面错误,以便能够自动生成性能摘要。

我知道有一些像cachegrind这样的工具可以给出一些关于给定应用程序执行的相关统计信息,但我想要一个库,正如我已经说过的那样。

编辑哦,我忘了:我正在使用Linux,我对可移植性不感兴趣,这是一个学术性的东西。

欢迎任何建议!

最新的CPU(AMD和Intel)都有性能监视器寄存器,可用于此类工作。 对于英特尔,程序员参考手册第3B卷第30章介绍了它们。对于AMD,它在BIOS和内核开发人员指南中。

无论哪种方式,您都可以计算缓存命中,缓存未命中,内存请求,数据预取等等。它们具有非常特定的选择器,因此您可以获得(例如)L2缓存上的读取次数来填充行在L1指令高速缓存中(同时仍然排除L2读取以填充L1数据高速缓存中的行)。

有一个Linux内核模块可以访问MSR(特定于模型的寄存器)。 另外,我不知道它是否可以访问性能监视器寄存器,但我希望它可能会这样做。

看起来现在正是我正在搜索的内容: perf_event_open

它允许您执行有趣的操作,例如初始化/启用/禁用某些性能计数器,以便随后通过统一且直观的API获取其值(它为您提供了一个特殊的文件描述符,其中包含一个包含先前请求的信息的结构)。

它是一个仅限Linux的解决方案,功能因内核版本而异,所以要小心:)

英特尔VTune是一款性能调优工具,可以满足您的要求; 当然,它可以与英特尔处理器配合使用,因为它可以访问内部处理器计数器,正如Jerry Coffin所解释的那样,所以这可能不适用于AMD处理器。 它暴露了数百个计数器,如缓存命中/未命中,分支预测率等。它的真正问题是了解要检查的计数器;)

缓存未命中不能轻易计算。 大多数工具或分析器通过将内存访问重定向到提供此功能的函数来模拟内存访问。 这意味着这些工具可以在所有进行内存访问的地方检测代码,并使代码运行缓慢。 这不是我的意图。

但是,根据硬件的不同,您可能还有其他一些可能性。 但即使是这种情况,操作系统也应该支持它(因为否则你会获得系统全局统计信息而不是与进程或线程相关的统计信息)

编辑:我可以找到这篇可能对你有帮助的文章: http//lwn.net/Articles/417979/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM