从操作系统/应用程序分析CPUcaching/内存?

我希望编写一个能够基本上分析CPUcaching(L2,L3,可能是L1)和内存的软件来分析性能。

我是否认为这是不可行的,因为软件无法访问caching内容?

另一种措辞我的问:有什么办法可以从操作系统/应用程序级别知道什么数据已经加载到caching/内存?

编辑:操作系统Windows或Linux和CPU英特尔台式机/至强

你可能想看看英特尔的PMU,即性能监测单元。 有些处理器有一个。 它是一堆专用寄存器(英特尔称之为模型专用寄存器,或MSR),您可以使用RDMSRWRMSR指令编程来计算事件,如缓存未命中。

以下是关于i7和Xeon 5500性能分析的文档。

您可能需要查看英特尔的性能计数器监视器 ,它基本上是抽象PMU的一些例程,您可以在C ++应用程序中使用这些例程来测量多个性能指标,包括缓存未命中。 它也有一些独立使用的GUI /命令行工具。

显然, Linux内核有一个操作MSR的工具 。

还有其他的实用程序/ API也使用PMU: perf , PAPI 。

缓存性能通常以命中率和缺失率来衡量。

有很多工具可以为你做到这一点。 检查Valgrind如何缓存分析 。

高速缓存的性能一般是以每个程序为基础进行测量的 编写良好的程序将会导致缓存未命中和缓存性能下降,反之亦然。

测量实际的缓存速度是硬件制造商头疼的事情,你可以参考他们的手册来知道这个值。

Callgrind / Cachegrind组合可以帮助您跟踪缓存命中/未命中

这有一些例子。 也可以使用使用PAPI工作的开源分析器TAU。

但是,如果您想编写一个代码来测量缓存统计信息,则可以使用PAPI编写程序。 PAPI允许用户访问硬件计数器而不需要知道系统架构。 PMU使用模型专用寄存器,因此您必须掌握要使用的寄存器。

Perf允许测量L1和LLC(即L2),另一方面Cachegrind允许用户测量L1和LLC(可以是L2或L3,无论哪个最高级别的缓存)。 只有当你不需要更快的结果时才使用Cachegrind,因为Cachegrind运行速度慢了10倍左右。