gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:41:07 25 4
gpt4 key购买 nike

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

我在一个输入上多次运行算法的主要代码(迭代),获取不同计数器的值(分支预测错误、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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com