在C ++中清除L1,L2和L3缓存的最正确方法是什么?

时间:2015-02-11 15:39:02

标签: c++ caching

我想在算法上运行一些实验,以了解它的缓存效率。

我在一次输入上运行算法的主代码几次(迭代),得到不同计数器的值(分支错误预测,L2,L3缓存访问,未命中等),然后在完成所有迭代后,我找到了每个计数器的平均值并将其作为输出返回。

为了使实验更精确,我需要在每次新迭代之前清除缓存。

所以代码看起来像这样:

main()
   for (it = 0; it < iterations; it++)
        clear_cache();
        run algorithm
        update counters
   return average of all counters

一切都按预期工作,但我不太清楚如何正确清除缓存。

我在网上找到了以下方法:

void clear_cache(){
   sync();
   std::ofstream ofs("/proc/sys/vm/drop_caches");
   ofs << "3" << std::endl;
   sync();
}

但是,如果迭代总量很大,则此方法需要花费大量时间才能执行。另一方面,如果我完全删除sync();,清算过程会变得更快。

但我不知道sync();在实践中做了什么。为什么没有sync();,一切都变得更快?我是否需要此调用以确保在每次新迭代之前所有L1,L2和L3缓存都清除?

提前谢谢

1 个答案:

答案 0 :(得分:3)

sync刷新未完成的文件写入。但是,它不会影响缓存的文件读取。您在网上找到的drop_caches方法确实清除了磁盘缓存,因此将来的任何读取都会占用磁盘。

所有这些无关到L1 / 2/3 CPU缓存。甚至不可能。 sync函数本身将在L1缓存中!

您需要汇编代码来刷新缓存,但是您忘了说明您拥有的CPU。