【发布时间】:2011-03-10 03:06:29
【问题描述】:
我知道这是特定于平台的问题,但是,我想对应用程序进行一些运行时分析,以检测缓存未命中和命中。我知道 cachegrind,一种用于 valgrind 和 vtune 的工具,并且存在大量其他分析实用程序。但是,我有兴趣实现我自己的缓存未命中检测版本。我知道 cachegrind 充当缓存模拟器。在不破解内核的情况下,如何实用地检测缓存未命中?我觉得这对于用户级应用程序来说几乎是不可能的,但无论如何我不得不问。
【问题讨论】:
我知道这是特定于平台的问题,但是,我想对应用程序进行一些运行时分析,以检测缓存未命中和命中。我知道 cachegrind,一种用于 valgrind 和 vtune 的工具,并且存在大量其他分析实用程序。但是,我有兴趣实现我自己的缓存未命中检测版本。我知道 cachegrind 充当缓存模拟器。在不破解内核的情况下,如何实用地检测缓存未命中?我觉得这对于用户级应用程序来说几乎是不可能的,但无论如何我不得不问。
【问题讨论】:
有办法做到这一点!在 Linux 上,您可以为此目的利用 Linux 性能计数器子系统。例如。看看这里:http://lxr.linux.no/#linux+v2.6.37.3/tools/perf/
【讨论】:
如何以实用的方式检测缓存未命中 [无需缓存模拟]?
缓存由硬件而不是内核管理。它们的参数(缓存级别、大小、踢出策略、回写/直写等)都是特定于处理器实现的。作为程序员,您“不应该知道它们的存在”。因此,在没有缓存模拟的情况下测量缓存未命中性能是不可能的。
另一方面,VM 页面(一个更 更粗略的“缓存”——在缓存保存大块内存的意义上)由操作系统管理。我想有办法通过入侵内核甚至创建一个漂亮的用户应用程序来收集有关页面错误的统计信息。页面错误统计可能对您没有多大用处(尤其是因为它们受到其他正在运行的进程的影响),但使用大量 RAM 的应用程序可能(a teeny, tiny bit) 具有类似于 CPU 缓存访问模式的页面错误或页面访问模式。但是,我不太确定细节。
【讨论】: