gpt4 book ai didi

c++ - 分析例程的缓存未命中

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:21 26 4
gpt4 key购买 nike

我想分析 C++ 程序中特定例程的缓存未命中率(率)。我知道一些分析工具,但它们似乎不太令我满意。

据我所知:

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

valgrind (cachegrind) 可以分析缓存未命中,但似乎只针对整个应用程序。

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

最后一个问题。 OProfile 需要为每个新 session 重新启动守护进程。假设我想通过多次运行分析我的程序——使用一组不同的参数和输入。我怎样才能以自动化的方式做到这一点?有没有办法像在代码中插入 gettimeofday() 来获取缓存统计信息?

最佳答案

假设您在特定函数中的缓存未命中很重要,那么使用 cachegrind 或 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 被“记入”缓存未命中。但是,假设您没有极端病态的代码,您将在缓存中未命中的代码区域获得缓存未命中记录。

关于c++ - 分析例程的缓存未命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24176632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com