c - 如何在 x86 Windows 中刷新 CPU 缓存?

标签 c windows x86 cpu cpu-cache

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

有没有一种已知的方法可以通过系统调用或什至像说一个大的 memcpy 这样偷偷摸摸的东西来做到这一点?

Intel i686 平台(P4 及以上也可以)。

最佳答案

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

指令“wbinvd”写回修改后的缓存内容并将缓存标记为空。它执行一个总线周期来使外部缓存刷新它们的数据。不幸的是,这是一个特权指令。但是,如果可以在 DOS 之类的环境下运行测试程序,那么这是可行的方法。这具有使“操作系统”的缓存占用空间非常小的优势。

此外,还有“invd”指令,它使缓存失效而不将它们刷新回主内存。这违反了主存和高速缓存的一致性,所以你必须自己处理。不太推荐。

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

您可以在 Test programs for measuring clock cycles and performance monitoring. 找到一些关于基准测试短例程的资源。

关于c - 如何在 x86 Windows 中刷新 CPU 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1756825/

相关文章:

c - 减少 C 中套接字之间的时间传输

x86 - 在 st0 中存储通用寄存器

c - 使用段寄存器 FS 进行调试

c - 使用 pthread 进行并行编程

c++ - 如何让 Valgrind 记录所有分配?

c - 检查另一个程序的输出的程序

c - 在Windows中读写PCI BAR0寄存器

linux - 在 IE 11 上运行 Protractor 测试

linux - rcu_read_lock 和 x86-64 内存排序

c - 在 C 中的内联函数中循环展开