我想分析一下C++程序中特定例程的缓存丢失率。我知道一些分析工具,但它们似乎不太能让我满意。
据我所知:
gprof可以生成调用图和代码覆盖率,但它不包括缓存遗漏分析。
valgrind (cache差事)可以分析缓存错误,但似乎只适用于整个应用程序。
oprofile确实有一个基于符号的输出。但是我有点困惑:如果过程A()调用B() (可能是库或系统调用),并且在B()中发生缓存错误,那么它是否归因于A()?毕竟,在A()的整个执行过程中,我想计算缓存丢失的次数。
最后一个问题。OProfile要求为每个新会话重新启动守护进程。假设我想用一系列不同的参数和输入来分析我的程序。我怎样才能用自动化的方式做这件事?是否有类似于将gettimeofday()插入到代码中以获取缓存统计信息的方法?
发布于 2014-06-12 07:38:50
假设特定函数中的缓存丢失是重要的,那么使用cache差事或oprofile都应该工作得很好。如果缓存在该函数中的缺失对整个程序的执行没有意义,那么为什么要烦恼呢?
但是我使用oprofile已经有几年了,但是您不需要重新启动守护进程,只需使用“重置我的数据”(opcontrol --reset)。由于oprofile是系统范围的,您可以简单地使用多个测试用例运行脚本-- oprofile会在每个进程中拆分数据,但是如果您在任何特定函数中有很高的缓存使用率,那么应该会出现在缓存丢失列表中。如果它没有出现,那么您的代码就不会丢失在缓存中。
我这么做的方法是编写一个脚本来完成opcontrol --reset --start event=CPU_CLK_UNHALTED:400000,然后是我正在测试的程序,然后是opcontrol --stop --save=oprofile.result。
请注意,oprofile是基于统计的和基于示例的,因此您不能度量单个缓存丢失,并且它记录缓存丢失计数器达到极限的地址。因此,如果有1000个缓存错误的“限制”,则函数A中有999个缓存未命中,而函数B中的一个缓存丢失,函数B“贷记”缓存失败。但是,假设您没有非常病态的代码,您将在缓存中丢失的代码区域中获得缓存丢失记录。
https://stackoverflow.com/questions/24176632
复制相似问题