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

What would be the most correct way to clear L1,L2 and L3 caches in C++?

我想 运行 对一种算法进行一些实验,以了解它的缓存效率如何。

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

为了实验准确,我需要在每次新的迭代前清空缓存。

所以代码看起来像这样:

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 缓存?

提前致谢

sync 刷新未完成的文件写入。不过,它不会影响缓存文件读取。您在网上找到的 drop_caches 方法确实会清除磁盘缓存,因此以后的任何读取操作也会命中磁盘。

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

您需要汇编代码来刷新缓存,但您忘记说明您有哪个CPU。