在 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。
我想 运行 对一种算法进行一些实验,以了解它的缓存效率如何。
我运行算法的主要代码在一个输入上多次(迭代),得到不同计数器的值(分支预测错误,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。