我想对一种算法进行一些实验,以了解它的缓存效率如何。
我在一个输入上多次运行算法的主要代码(迭代),获取不同计数器的值(分支错误预测、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 缓存都将被清除?
提前谢谢
最佳答案
sync
刷新未完成的文件写入。不过,它不会影响缓存文件的读取。您在网上找到的 drop_caches
方法确实会清除磁盘缓存,因此以后的任何读取也都会命中磁盘。
所有这些都与 L1/2/3 CPU 缓存无关。甚至不可能。 sync
函数本身将位于 L1 缓存中!
您需要汇编代码来刷新缓存,但您忘记说明您拥有哪个 CPU。
关于c++ - 在 C++ 中清除 L1、L2 和 L3 缓存的最正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28458343/