确定内存位置是否在CPU缓存中

时间:2009-03-25 19:13:32

标签: memory assembly caching cpu fault

操作系统可以确定一页内存是在DRAM中还是在交换中;例如,只是尝试访问它,如果发生页面错误,则不是。

然而,CPU缓存可能是同样的事情吗?

是否有任何有效的方法来判断给定的内存位置是否已加载到缓存行中,或知道它何时这样做?

3 个答案:

答案 0 :(得分:6)

总的来说,我不认为这是可能的。它适用于DRAM和页面文件,因为它是操作系统管理的资源,缓存由CPU本身管理。

操作系统可以执行内存读取的紧密计时循环,并尝试查看它是否足够快地完成缓存,或者是否必须转到主内存 - 这将非常容易出错。

在多核/多进程系统上,处理器之间使用cache coherency protocols来确定何时需要使对方的缓存无效,我想你可以拥有一个可以窥探这个协议的自定义设备操作系统会查询。

你想做什么?如果你想强迫某些东西进入内存,当前的x86处理器支持以非阻塞的方式将内存预取到缓存中,例如使用Visual C ++,你可以使用_mm_prefetch来获取缓存中的一行。

编辑: 我自己没有这样做,所以请自担风险。要确定用于分析的高速缓存未命中,您可以使用一些特定于体系结构的寄存器。 http://download.intel.com/design/processor/manuals/253669.pdf,附录A给出了“性能调优事件”。这不能用于确定单个地址是在缓存中还是在缓存中加载,而是可以用于整体统计。我相信这就是vTune(这个级别的现象剖析器)所使用的。

答案 1 :(得分:5)

如果您尝试自己确定,那么运行程序的行为可能会使相关的缓存行无效,从而导致测量无效。

这是反映科学原理的案例之一,即你不能在不影响你所测量的东西的情况下测量某些东西。

答案 2 :(得分:1)

X86 不知道如何判断地址是否在缓存中 但这里是如何判断缓存中的地址是否为WAS

rdtsc
save timestamp
mov eax,address
rdtsc read timestamp counter
calculate timestamp difference
if < threshold then was in cache

阈值必须从文档或经验

确定

某些计算机具有缓存命中/未命中计数器,这些计数器同样可以正常运行