操作系统可以确定内存页是在 DRAM 中还是在交换中;例如,只需尝试访问它,如果发生页面错误,则不是。
但是,CPU 缓存是否可以实现相同的功能?
是否有任何有效的方法来判断给定的内存位置是否已加载到缓存行中,或者知道它何时加载?
一般来说,我认为这是不可能的。它适用于 DRAM 和页面文件,因为这是操作系统管理的资源,缓存由 CPU 本身管理。
操作系统可以对内存读取进行严格的计时循环,并尝试查看它是否以足够快的速度完成以进入缓存,或者它是否必须进入主内存——这很容易出错。
在多核/多进程系统上,处理器之间使用缓存一致性协议来确定它们何时需要使彼此的缓存无效,我想你可以有一个自定义设备来监听操作系统会查询的这个协议.
你想做什么?如果您想将某些内容强制到内存中,当前的 x86 处理器支持以非阻塞方式将内存预取到缓存中,例如,您可以使用 Visual C++ 将_mm_prefetch
行提取到缓存中。
编辑:我自己没有这样做,所以使用风险自负。要确定用于分析的缓存未命中,您可以使用一些特定于体系结构的寄存器。 http://download.intel.com/design/processor/manuals/253669.pdf,附录 A 给出了“性能调整事件”。这不能用于确定单个地址是否在缓存中或何时加载到缓存中,但可用于总体统计信息。我相信这就是 vTune(这个级别的非凡分析器)使用的。
如果您尝试自己确定这一点,那么运行程序的行为可能会使相关的缓存行无效,从而使您的测量无用。
这是反映科学原理的情况之一,即您无法在不影响您正在测量的东西的情况下测量某物。
X86 不知道如何判断地址是否在缓存中,但这里是如何判断地址是否在缓存中
rdtsc
save timestamp
mov eax,address
rdtsc read timestamp counter
calculate timestamp difference
if < threshold then was in cache
阈值必须从文档或经验中确定
一些机器有缓存命中/未命中计数器,它们同样适用