我想在算法上运行一些实验,以了解它的缓存效率。
我在一次输入上运行算法的主代码几次(迭代),得到不同计数器的值(分支错误预测,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缓存都清除?
提前谢谢
答案 0 :(得分:3)
sync
刷新未完成的文件写入。但是,它不会影响缓存的文件读取。您在网上找到的drop_caches
方法确实清除了磁盘缓存,因此将来的任何读取都会占用磁盘。
所有这些无关到L1 / 2/3 CPU缓存。甚至不可能。 sync
函数本身将在L1缓存中!
您需要汇编代码来刷新缓存,但是您忘了说明您拥有的CPU。