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

use*_*135 46 c windows cpu x86 cpu-cache

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

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

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

Gun*_*iez 52

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

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

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

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

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

  • wbinvd指令需要大约2000-5000个时钟周期才能完成!大多数指令平均需要2-5。 (2认同)

int*_*tgr 8

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

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

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

  • CLFLUSH指令不会仅刷新L1缓存.从英特尔x86-64参考手册:"CLFLUSH(刷新缓存行)指令写入并使与指定线性地址关联的缓存行无效.失效是针对处理器缓存层次结构的所有级别,并在整个缓存中广播一致性域." (5认同)
  • 我相信你将CPU缓存与其他操作系统级别的缓存混淆.操作系统对CPU将缓存或不缓存的内容基本没有发言权,因为这些决策需要如此快速地发生,内核中断或类似的东西没有时间.CPU缓存完全由硅实现. (4认同)