我希望编写的软件本质上可以分析CPU缓存(L2,L3,可能是L1)和内存,以分析性能。
我是否认为这是不可行的,因为软件无法访问缓存内容?
另一种措辞我的问:从操作系统/应用程序级别可以知道哪些数据已加载到缓存/内存中?
编辑:操作系统Windows或Linux和CPU Intel Desktop / Xeon
答案 0 :(得分:7)
您可能需要查看英特尔的PMU,即性能监控单元。有些处理器有一个。它是一组专用寄存器(英特尔称之为模型特定寄存器或MSR),您可以使用RDMSR
和WRMSR
指令对其进行编程以计算事件,如缓存未命中。
以下是有关Performance Analysis on i7 and Xeon 5500。
的文件您可能需要查看英特尔的 Performance Counter Monitor ,这基本上是一些抽象PMU的例程,您可以在C ++应用程序中使用它来实时测量多个性能指标,包括缓存未命中。它还有一些用于独立使用的GUI / Commandline工具。
答案 1 :(得分:2)
缓存性能通常以命中率和未命中率来衡量。
有很多工具可以帮到你。检查Valgrind does cache profiling的方式。
缓存性能通常基于每个程序进行衡量 。编写良好的程序将导致更少的缓存未命中和更好的缓存性能,反之亦然,因为编写得不好的代码。
测量实际缓存速度是硬件制造商头痛的问题,您可以参考他们的手册来了解这个值。
Callgrind / Cachegrind组合可以帮助您跟踪缓存命中/未命中
答案 2 :(得分:0)
This有一些例子。 也可以使用TAU,一种使用PAPI工作的开源分析器。
但是,如果要编写用于测量缓存统计信息的代码,可以使用PAPI编写程序。 PAPI允许用户访问硬件计数器而无需了解系统架构。 PMU使用模型特定寄存器,因此您必须具有要使用的寄存器的知识。
Perf允许测量L1和LLC(这是L2),另一方面,Cachegrind允许用户测量L1和LLC(可以是L2或L3,无论哪个最高级别的缓存是)。仅当您不需要更快的结果时才使用Cachegrind,因为Cachegrind运行程序的速度要慢10倍。