8

我希望编写可以从本质上分析 CPU 缓存(L2、L3,可能是 L1)和内存的软件,以分析性能。

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

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

编辑:操作系统 Windows 或 Linux 和 CPU Intel Desktop/Xeon

4

3 回答 3

8

您可能想查看 Intel 的 PMU,即性能监控单元。一些处理器有一个。它是一堆特殊用途的寄存器(英特尔称它们为模型特定寄存器,或 MSR),您可以使用RDMSRWRMSR指令对它们进行编程以计数事件,例如缓存未命中。

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

您可能想查看 Intel 的Performance Counter Monitor,它基本上是一些抽象 PMU 的例程,您可以在 C++ 应用程序中使用它来实时测量多个性能指标,包括缓存未命中。它还有一些用于独立使用的 GUI/命令行工具。

显然,Linux 内核具有操纵 MSR 的工具

还有其他实用程序/API 也使用 PMU:perfPAPI

于 2012-04-12T13:03:16.517 回答
4

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

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

此外,缓存性能通常以每个程序为基础进行测量。写得好的程序将导致更少的缓存未命中和更好的缓存性能,反之亦然,写得不好的代码。

测量实际缓存速度是硬件制造商最头疼的问题,您可以参考他们的手册来了解这个值。

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

于 2012-04-12T11:47:15.627 回答
1

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

但是,如果您想编写代码来测量缓存统计信息,您可以使用 PAPI 编写程序。PAPI 允许用户在无需了解系统架构的情况下访问硬件计数器。PMU 使用模型特定寄存器,因此您必须了解要使用的寄存器。

Perf 允许测量 L1 和 LLC(即 L2),Cachegrind 另一方面允许用户测量 L1 和 LLC(可以是 L2 或 L3,以最高级别的缓存为准)。仅当您不需要更快的结果时才使用 Cachegrind,因为 Cachegrind 运行程序的速度大约慢了 10 倍。

于 2014-03-20T09:58:06.883 回答