c++ - 测量缓存内存使用情况

标签 c++ c linux

我想调用一个函数并测量该函数使用的数据缓存内存量。是否有任何 C 或 C++ 程序,或基于 Linux 的系统中的任何库?

测量时间就像

start = timestamp();
proc()
end = timestamp();
proctime = end - start;

最佳答案

简短回答:

如果不模拟处理器,这可能无法完成。

长答案:

在用户模式下,在任何现代操作系统中,您将无法获取此类数据。您可以使用 oprofileperf 来获取缓存命中和未命中数 - 不幸的是,它不会准确地告诉您有多少是由您的进程引起的,有多少是由其他进程引起的系统中的进程(因为处理器具有的处理器计数器是全局的,并且该工具不知道进程何时切入/切出,只知道“当计数器到达触发值时哪个进程正在运行”)。

换句话讲,这将提供统计数据,而不是您想要测量的实际数字。此外,它实际上不会告诉您是否使用了 1% 还是 100% 的缓存,只是告诉您正在使用缓存中的数据量与不在缓存中的数据量相比 - 如果您真的很聪明的话,您可能会编写一些获得 95% 缓存未命中率的内容,但只使用少量缓存行 [但是需要一些工作来实际使用一个或多个具有 N*cache_size 距离的内存块中的正确地址他们之间]。

然而,它是一个非常可行的模型,用于弄清楚“我的代码是否存在缓存未命中问题”。

除了以下极端方法之外,我不知道有任何方法可以实际执行您想要的操作:

  1. 将代码放入内核模块中。
  2. 禁用所有中断。
  3. 设置性能计数器以对数据 L1、L2 等的缓存命中/未命中进行计数。
  4. 运行您要测试的函数。
  5. 收集结果。

这变得非常不切实际,因为代码将无法执行任何 I/O 或访问换出的内存,并且如果中断关闭时间超过几毫秒,操作系统可能会感到不安。 ..

链接到 Linux 内核的“perf”项目: https://perf.wiki.kernel.org/index.php/Main_Page 如果您有一个相当新的内核,那么这将是您衡量总体性能的理想工具。

关于c++ - 测量缓存内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638419/

相关文章:

c++ - CMake Visual Studio 找不到库

c++ - 有人建议我这段代码中剩下的内容。运行时未显示任何错误,但输出带有垃圾值

c - 设置所需内存地址错误

有人可以解释我在 C 中右移的行为吗?

c++ - 从 qt 设计器访问自定义 qt 设计器插件子小部件

c++ - 为什么 cin 在使用 getline 后没有获取缓冲区数据?

c - 如何执行进程内存?

linux - 如何在 Ubuntu 9.10 上检查 openCV

Java JComboBox 自定义渲染器和 GTK

linux - 最小的 x86_64 Hello World ELF 二进制文件是什么?