如何清除CPU L1和L2缓存

Sha*_*dra 6 caching

我在xeon服务器上运行基准测试,我重复执行2-3次.我想在重复运行时擦除L1和L2中的缓存内容.你能建议任何方法吗?

Mac*_*tka 9

尝试通过CPU(即不通过DMA)重复读取大数据.喜欢:

 int main() {
     const int size = 20*1024*1024; // Allocate 20M. Set much larger then L2
     char *c = (char *)malloc(size);
     for (int i = 0; i < 0xffff; i++)
       for (int j = 0; j < size; j++)
         c[j] = i*j;
 }
Run Code Online (Sandbox Code Playgroud)

但是依赖于服务器更大的问题可能是磁盘缓存(在内存中)然后是L1/L2缓存.在Linux上(例如)使用drop:

 sync
 echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

编辑:生成无效的大型程序是微不足道的:

#!/usr/bin/ruby
puts "main:"
200000.times { puts "  nop" }
puts "  xor rax, rax"
puts "  ret"
Run Code Online (Sandbox Code Playgroud)

以不同的名称运行几次(代码不是由脚本生成)应该完成工作

  • 大多数现代CPU都有单独的指令和数据缓存; 循环通过20M的RAM可能会清理数据缓存; 它不会触及指令缓存.此外,不能保证CPU将使用它的所有缓存,它可能只是连续重复使用相同的小部分. (6认同)
  • 我不同意'只是把它关掉'.缓存会大大影响优化技术,关闭它会影响结果.最好随机化技术(如随机命令`nop`,`xor rax,rbx`,`add rax,rbx`等. (2认同)