以编程方式计算缓存故障

aka*_*ppa 8 c++ linux memory-management

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

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

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

欢迎任何建议!

Jer*_*fin 5

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

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

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


aka*_*ppa 5

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

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

这是仅Linux的解决方案,其功能因内核版本而异,因此请小心:)