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