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

Memory 确定内存位置是否在CPU缓存中,memory,assembly,caching,cpu,fault,Memory,Assembly,Caching,Cpu,Fault,操作系统可以确定内存页是在DRAM中还是在交换中;例如,只要尝试访问它,如果出现页面错误,它就不会被访问 但是,CPU缓存是否也可以做到这一点 有没有有效的方法来判断给定的内存位置是否已加载到缓存线,或者知道它何时加载到缓存线?一般来说,我认为这是不可能的。它适用于DRAM和页面文件,因为这是一个操作系统管理的资源,缓存由CPU本身管理 操作系统可以对内存读取进行严格的定时循环,并尝试查看它完成的速度是否足够快,是否可以进入缓存,或者是否必须进入主内存——这将非常容易出错 在多核/多进程系统上,

操作系统可以确定内存页是在DRAM中还是在交换中;例如,只要尝试访问它,如果出现页面错误,它就不会被访问

但是,CPU缓存是否也可以做到这一点


有没有有效的方法来判断给定的内存位置是否已加载到缓存线,或者知道它何时加载到缓存线?

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

操作系统可以对内存读取进行严格的定时循环,并尝试查看它完成的速度是否足够快,是否可以进入缓存,或者是否必须进入主内存——这将非常容易出错

在多核/多进程系统上,在处理器之间有一些用于确定何时使彼此的缓存无效的设备,我想您可以有一个自定义设备来窥探操作系统将查询的协议

你想干什么?如果你想把某个东西强加到内存中,当前的x86处理器支持以非阻塞方式将内存预取到缓存中,例如VisualC++可以用来在缓存中获取一行。 编辑:
我自己还没做过,所以使用风险自负。要确定分析的缓存未命中,您可以使用一些特定于体系结构的寄存器,附录A给出了“性能调整事件”。这不能用于确定单个地址是否在缓存中或何时加载到缓存中,但可以用于总体统计。我相信这就是vTune(这一级别的非凡分析器)所使用的。

如果您试图自己确定这一点,那么运行程序的行为可能会使相关缓存线无效,从而使测量结果变得无用

这是反映科学原理的一种情况,即如果不影响正在测量的东西,就无法测量某物。

X86 不知道如何判断地址是否在缓存中 但下面是如何判断地址是否在缓存中

rdtsc
save timestamp
mov eax,address
rdtsc read timestamp counter
calculate timestamp difference
if < threshold then was in cache
rdtsc
保存时间戳
mov eax,地址
rdtsc读取时间戳计数器
计算时间戳差
如果<阈值,则在缓存中
阈值必须根据文件或经验确定


有些机器有缓存命中/未命中计数器,同样适用于

谢谢。我很感兴趣,因为我在玩弄编写内核。我对在实际硬件上分析缓存线未命中感兴趣。直到看到Herb Sutter的幻灯片,我才意识到它们对现代CPU的危害有多大:许多现代CPU都有性能计数器,可以提供各种信息,包括缓存相关的统计数据。这听起来很有趣。你有什么参考资料吗?哇,有很多参考资料,非常有趣:@mike.amy-我添加了一个指向英特尔IA-32手册的链接,其中应该详细介绍性能事件。很容易验证缓存中是否有位置。只要读一读,瞧,它就会在缓存中诀窍在于测试缓存中是否有内容。:)如果你确保你的代码是从不可缓存的内存中运行的,那么仅仅运行一个程序的行为不会影响缓存。好的方面。因此,基本上我必须考虑可能发生的所有其他情况,以便知道缓存未命中是否加载了相关内存。