我想调用一个函数并测量该函数使用的数据缓存内存量。是否有任何 C 或 C++ 程序,或基于 Linux 的系统中的任何库?
测量时间就像
start = timestamp();
proc()
end = timestamp();
proctime = end - start;
最佳答案
简短回答:
如果不模拟处理器,这可能无法完成。
长答案:
在用户模式下,在任何现代操作系统中,您将无法获取此类数据。您可以使用 oprofile
或 perf
来获取缓存命中和未命中数 - 不幸的是,它不会准确地告诉您有多少是由您的进程引起的,有多少是由其他进程引起的系统中的进程(因为处理器具有的处理器计数器是全局的,并且该工具不知道进程何时切入/切出,只知道“当计数器到达触发值时哪个进程正在运行”)。
换句话讲,这将提供统计数据,而不是您想要测量的实际数字。此外,它实际上不会告诉您是否使用了 1% 还是 100% 的缓存,只是告诉您正在使用缓存中的数据量与不在缓存中的数据量相比 - 如果您真的很聪明的话,您可能会编写一些获得 95% 缓存未命中率的内容,但只使用少量缓存行 [但是需要一些工作来实际使用一个或多个具有 N*cache_size 距离的内存块中的正确地址他们之间]。
然而,它是一个非常可行的模型,用于弄清楚“我的代码是否存在缓存未命中问题”。
除了以下极端方法之外,我不知道有任何方法可以实际执行您想要的操作:
- 将代码放入内核模块中。
- 禁用所有中断。
- 设置性能计数器以对数据 L1、L2 等的缓存命中/未命中进行计数。
- 运行您要测试的函数。
- 收集结果。
这变得非常不切实际,因为代码将无法执行任何 I/O 或访问换出的内存,并且如果中断关闭时间超过几毫秒,操作系统可能会感到不安。 ..
链接到 Linux 内核的“perf”项目: https://perf.wiki.kernel.org/index.php/Main_Page 如果您有一个相当新的内核,那么这将是您衡量总体性能的理想工具。
关于c++ - 测量缓存内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638419/