gpt4 book ai didi

valgrind - Kcachegrind/callgrind 对于调度程序功能不准确?

转载 作者:行者123 更新时间:2023-12-01 05:38:09 29 4
gpt4 key购买 nike

我有一个 kcachegrind/callgrind 报告奇怪结果的模型代码。这是一种调度程序功能。调度员从 4 个地方调用;每个电话都说,实际do_J要运行的函数(所以 first2 将只调用 do_1do_2 等等)

源代码(这是实际代码的模型)

#define N 1000000

int a[N];
int do_1(int *a) { int i; for(i=0;i<N/4;i++) a[i]+=1; }
int do_2(int *a) { int i; for(i=0;i<N/2;i++) a[i]+=2; }
int do_3(int *a) { int i; for(i=0;i<N*3/4;i++) a[i]+=3; }
int do_4(int *a) { int i; for(i=0;i<N;i++) a[i]+=4; }

int dispatcher(int *a, int j) {
if(j==1) do_1(a);
else if(j==2) do_2(a);
else if(j==3) do_3(a);
else do_4(a);
}

int first2(int *a) { dispatcher(a,1); dispatcher(a,2); }
int last2(int *a) { dispatcher(a,4); dispatcher(a,3); }
int inner2(int *a) { dispatcher(a,2); dispatcher(a,3); }
int outer2(int *a) { dispatcher(a,1); dispatcher(a,4); }

int main(){
first2(a);
last2(a);
inner2(a);
outer2(a);
}

编译 gcc -O0 ; Callgrinded 与 valgrind --tool=callgrind ; kcachegrinded 与 kcachegrindqcachegrind-0.7 .

这是应用程序的完整调用图。 do_J 的所有路径都通过调度程序,这很好(do_1 只是隐藏得太快了,但它真的在这里,只是留给 do_2)

Full

让我们聚焦 do_1并检查,谁调用它(这张图片是不正确的):

enter image description here

这很奇怪,我想,只有 first2outer2do_1但不是所有的。

这是 callgrind/kcachegrind 的限制吗?如何获得具有权重的准确调用图(与每个函数的运行时间成正比,有无其子项)?

最佳答案

是的,这是 callgrind 格式的限制。它不存储完整的跟踪;它只存储父子调用信息。

有一个带有 pprof/libprofiler.so CPU 分析器的 google-perftools 项目,http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html . libprofiler.so可以使用 calltraces 获取配置文件,它将使用完整的回溯存储每个跟踪事件。 pprof是 libprofile 输出到图形格式或 callgrind 格式的转换器。在全 View 中,结果将与 kcachegrind 中的相同;但是如果您将专注于某些功能,例如do_1 使用 pprof 的选项焦点;当专注于功能时,它将显示准确的调用树。

关于valgrind - Kcachegrind/callgrind 对于调度程序功能不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488793/

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