我正在尝试使用linux上的WBINV指令来清除处理器的L1缓存。
下面的程序可以编译,但当我尝试运行它时,它会产生一个分段错误。
int main() {asm ("wbinvd"); return 1;}
我使用的是gcc 4.4.3,并在我的x86机器上运行Linux kernel 2.6.32-33。
处理器信息:英特尔(R)酷睿(TM)2双核CPU T5270 @1.40 CPU
我按如下方式构建了这个程序:
$ gcc
$ ./a.out
分段故障
谁能告诉我我哪里做错了?我怎么才能让它运行?
附言:我正在运行一些性能测试,并希望确保处理器缓存之前的内容不会影响结果。
发布于 2011-07-19 18:27:17
WBINVD指令是一条特权指令。当处理器在保护模式下运行时,程序或过程的CPL必须为0才能执行此指令。
换句话说,只允许内核模式代码执行它。
EDIT:上一篇关于清除缓存的SO讨论:
"C" programmatically clear L2 cache on Linux machines
How can I do a CPU cache flush in x86 Windows?
How to clear CPU L1 and L2 cache
https://stackoverflow.com/questions/3443130/how-to-clear-cpu-l1-and-l2-cache
发布于 2011-07-19 20:31:09
正如user786653所写的,wbinvd它是一个特权指令,它在非内核代码中分段。
您应该避免使用wbinvd进行基准测试,因为它强制执行所有类型的总线锁定周期、流水线序列化,并增加从内核到用户空间的开销等,这在您的实际程序中很可能不会发生。
因此,您的测量将不会更精确,它将包含所有类型的工件。读取L2缓存大小的数据区块将产生更好的结果。
您可以阅读Test programs for measuring clock cycles and performance monitoring下的源代码,看看其他人是如何获得有用的结果的。
https://stackoverflow.com/questions/6745665
复制相似问题