在Linux中实现缓存命中和未命中的实用检测方法

4
我知道这是一个特定于平台的问题,但是我想要对应用程序进行一些运行时分析,以检测缓存未命中和命中情况。我知道cachegrind是valgrind工具的一部分,还有vtune等其他性能分析工具。然而,我对实现自己版本的缓存未命中检测很感兴趣。我知道cachegrind充当了缓存模拟器的角色。除了破坏内核外,我如何在程序中实现缓存未命中检测呢?我有一种感觉,在用户空间应用程序中实现这个功能几乎是不可能的,但我还是想问一下。
2个回答

5

4
我怎样才能在没有缓存模拟的情况下实现缓存未命中的检测?
缓存由硬件管理,而不是内核。它们的参数(缓存级别、大小、替换策略、写回/写直通等)都是处理器实现特定的。作为程序员,你“不应该知道它们的存在”。因此,在没有缓存模拟的情况下测量缓存未命中性能是不可能的。
另一方面,虚拟内存页面(一种更粗略的“缓存” - 在这里缓存保存了内存块)由操作系统管理。我想可能会有方法通过对内核进行黑客攻击甚至创建一个巧妙的用户应用程序来收集有关页面错误的统计信息。但页面错误统计数据可能对您并不是太有用(特别是因为它们受到其他运行进程的影响),但使用大量RAM的应用程序可能具有与CPU缓存访问模式类似的页面错误或页面访问模式。然而,我对细节并不是很确定。

好的,说得对。我知道内核在加载时初始化分页系统。也许我应该更多地询问页面命中/未命中的情况。 - MattD
很多处理器似乎都能报告缓存未命中等信息。例如,perfex使用了这个:http://www.complang.tuwien.ac.at/anton/linux-perfex/ppc7450.html 但是它还需要打补丁到内核中。 - Plankalkül
@advait:你关于测量缓存未命中的答案是错误的。CPU 实现了硬件性能计数器,可以被软件读取。如果您想要优化软件的缓存行为,这是至关重要的。 - Adrian Willenbücher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接