首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分析例程的缓存错误

分析例程的缓存错误
EN

Stack Overflow用户
提问于 2014-06-12 04:50:23
回答 1查看 1.5K关注 0票数 3

我想分析一下C++程序中特定例程的缓存丢失率。我知道一些分析工具,但它们似乎不太能让我满意。

据我所知:

gprof可以生成调用图和代码覆盖率,但它不包括缓存遗漏分析。

valgrind (cache差事)可以分析缓存错误,但似乎只适用于整个应用程序。

oprofile确实有一个基于符号的输出。但是我有点困惑:如果过程A()调用B() (可能是库或系统调用),并且在B()中发生缓存错误,那么它是否归因于A()?毕竟,在A()的整个执行过程中,我想计算缓存丢失的次数。

最后一个问题。OProfile要求为每个新会话重新启动守护进程。假设我想用一系列不同的参数和输入来分析我的程序。我怎样才能用自动化的方式做这件事?是否有类似于将gettimeofday()插入到代码中以获取缓存统计信息的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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“贷记”缓存失败。但是,假设您没有非常病态的代码,您将在缓存中丢失的代码区域中获得缓存丢失记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24176632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档