【问题标题】:How to clear CPU L1 and L2 cache [duplicate]如何清除 CPU L1 和 L2 缓存 [重复]
【发布时间】:2011-03-27 15:28:32
【问题描述】:

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

【问题讨论】:

  • 您正在测试哪种架构和操作系统?
  • 我想在服务器上做一些随机的其他事情一分钟左右会有点粗鲁?
  • 我的问题是你为什么要这样做?
  • 我不止一次运行基准测试来收集有关内存和缓存行为的数据。我不希望缓存影响我的结果
  • 我正在运行 Linux 操作系统,Intel x86_64 架构

标签: caching


【解决方案1】:

尝试通过 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;
 }

但是取决于服务器,更大的问题可能是磁盘缓存(在内存中)然后是 L1/L2 缓存。在 Linux 上(例如)删除使用:

 sync
 echo 3 > /proc/sys/vm/drop_caches

编辑:生成什么都不做的大程序是微不足道的:

#!/usr/bin/ruby
puts "main:"
200000.times { puts "  nop" }
puts "  xor rax, rax"
puts "  ret"

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

【讨论】:

  • 大多数现代 CPU 都有独立的指令和数据缓存;虽然循环通过 20M 的 RAM 可能会清理数据缓存;它不会触及指令缓存。此外,不能保证 CPU 会使用它的所有缓存,它可能只是不断地重复使用相同的小部分。
  • 解决方法基本相同。生成大量代码并执行。
  • 较新的处理器会识别该模式并且不会使现有的缓存行无效;因此它只会为您的程序使用 2 行(左右)缓存。如果缓存是一个重要因素;最好将其关闭而不使用它。另一方面;一开始它可能并没有带来什么不同。
  • 我不同意“只是将其关闭”。缓存会在很大程度上影响优化技术,关闭它会影响结果。最好随机化技术(如随机命令nopxor rax, rbxadd rax, rbx 等。
  • @MaciejPiechotka 与其创建 2 个嵌套循环,不如增加 c[j]?使用您的解决方案,您在每次外部迭代中“更新”相同的 20MB 数据循环 65k 次......我不明白为什么。
猜你喜欢
  • 2014-07-04
  • 2010-11-09
  • 2021-11-27
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2011-04-11
  • 2015-06-29
相关资源
最近更新 更多