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

标签 c++ caching

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

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

相关文章:

c# - 使用 HttpRuntime.Cache 的问题

c++ - 清除范围(将范围设置为零)惰性线段树修改

c++ - 在迭代过程中从 vector 中删除元素 C++

c++ - 在 Visual Studio 2008 中显示 CR/LF 的 Visual C++ 调试窗口

php - 是否有可能使用 Drupal(无缓存)获得 <200 毫秒的响应?

android - 使 picasso 中的缓存无效

c++ - 构建 Hugin 项目 - 未找到 boost

c++ - 双重声明 C++

java - 如果查询类型为默认值,Elasticsearch 缓存查询将不起作用

iphone - 为 UIWebView 添加模型层(带缓存); UIWebViewNavigationType 和 shouldStartLoadWithRequest 的问题