cpu二级缓存 - cpu缓存




如何在x86 Windows中执行CPU缓存刷新? (2)

幸运的是,有多种方法可以显式刷新缓存。

指令“wbinvd”写回修改的缓存内容并将缓存标记为空。 它执行一个总线周期,以使外部缓存刷新其数据。 不幸的是,这是一项特权指导。 但是,如果可以在像DOS这样的程序下运行测试程序,那么这就是要走的路。 这具有使“OS”的高速缓存占用空间非常小的优点。

此外,还有“invd”指令,它使缓存无效而不将它们刷回主存储器。 这违反了主内存和缓存的一致性,因此您必须自己处理。 不是真的推荐。

出于基准测试的目的,最简单的解决方案可能是将大内存块复制到标有WC(写入组合)而不是WB的区域。 图形卡的存储器映射区域是一个很好的候选区域,或者您可以通过MTRR寄存器自己将区域标记为WC。

您可以在测试程序中找到有关基准测试短程序的一些资源, 以测量时钟周期和性能监控。

我感兴趣的是在Windows中强制CPU缓存刷新(出于基准测试的原因,我想模拟从CPU缓存中没有数据开始),最好是基本的C实现或Win32调用。

是否有一种已知的方法可以通过系统调用执行此操作,甚至可以像使用大型memcpy那样偷偷摸摸地执行此操作?

英特尔i686平台(P4及以上版本也可以)。


有x86汇编指令强制CPU刷新某些缓存行(例如CLFLUSH ),但它们非常模糊。 特别是CLFLUSH只刷新L1缓存中的选定地址。

像大记忆一样偷偷摸摸的东西?

是的,这是最简单的方法,并确保CPU刷新所有级别的缓存。 只需从您的工作台中排除缓存刷新时间,您就应该知道您的程序在缓存压力下的执行情况。





cpu-cache