如何在x86 Windows中执行CPUcaching刷新?
我有兴趣强制在Windows中刷新CPUcaching(出于基准testing的原因,我想仿效CPUcaching中没有数据开始),最好是基本的C实现或Win32调用。
有没有一种已知的方式来做这个系统调用,甚至像做一个大的memcpy
一样鬼鬼祟祟?
英特尔i686平台(P4和以上也可以)。
幸运的是,显式刷新caching的方式不止一种。
指令“wbinvd”写回修改后的caching内容并将caching标记为空。 它执行一个总线周期来使外部caching刷新他们的数据。 不幸的是,这是一项特权指令。 但是,如果可以像DOS一样运行testing程序,这是要走的路。 这具有保持“OS”的caching足迹非常小的优点。
另外还有一个“invd”指令,这个指令使得caching无效而不把它们刷新回主内存。 这违反了主内存和caching的一致性,所以你必须亲自处理。 不是真的推荐。
对于基准testing而言,最简单的解决scheme可能是将一个较大的内存块复制到标有WC(写组合)而不是WB的区域。 显卡的内存映射区域是一个很好的select,或者你可以通过MTRR寄存器自己标记一个区域为WC。
您可以在testing程序中find一些有关测量时钟周期和性能监控的短程序基准的资源。
有x86汇编指令强制CPU刷新某些caching行(如CLFLUSH ),但它们很模糊。 CLFLUSH特别只会刷新L1caching中选定的地址。
像做一个大的记忆体一样偷偷摸摸的事情?
是的,这是最简单的方法,并确保CPU刷新所有级别的caching。 只要排除caching刷新时间,你应该知道你的程序是如何在caching压力下执行的。
不幸的是没有办法显式刷新caching。 您的一些select是:
1.)通过在你正在testing的代码迭代之间进行一些非常大的内存操作来对caching进行琐碎处理。
2.)在x86控制寄存器中启用高速caching禁用并对其进行基准testing。 这可能会禁用指令caching也可能不是你想要的。
3.)使用Non-Temporal指令来实现你的代码的一部分(如果可能的话)。 尽pipe这些仅仅是处理器使用caching的提示 ,但它仍然可以按照自己的意愿进行操作。
1可能是最简单和足够的你的目的。
编辑 :哎呀,我站在纠正有一个指示,使x86caching失效,请参阅drhirsch的答案