【发布时间】:2018-03-19 13:41:11
【问题描述】:
我正在尝试使用 gprof 来分析我正在开发的一些数字代码,但 gprof 似乎无法从我的程序中收集数据。这是我的命令行:
g++ -Wall -O3 -g -pg -o fftw_test fftw_test.cpp -lfftw3 -lfftw3_threads -lm && ./fftw_test
gmon.out 文件已创建,但似乎没有数据。当我跑步时
gprof -b fftw_test gmon.out > gprof.out
我得到的只是
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name
Index by function name
有什么见解吗?
代码做了很多事情,它不只是简单地调用 FFTW 例程。它具有计算某些复数系数的函数、将输入数据乘以这些系数的函数等等。
编辑。:包括示例代码和结果。
#include <cstdlib>
#include <ctime>
int main()
{
std::srand( std::time( 0 ) );
double sum = 0.0;
for ( int i = 0; i < RAND_MAX; ++i )
sum += std::rand() / ( double ) RAND_MAX;
std::cout << sum << '\n';
return 0;
}
命令行:
$ g++ -Wall -O3 -g -pg -o gprof_test gprof_test.cpp && ./gprof_test
1.07374e+09
$ gprof -b gprof_test gmon.out > gprof.out
$ cat gprof.out
结果:
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
Call graph
granularity: each sample hit covers 2 byte(s) no time propagated
index % time self children called name
Index by function name
就是这样。
【问题讨论】:
-
没有一次互动?好吧,我已经尝试过用于 Linux 的 perf 工具,它们似乎做得很好,但解释输出并不是一件简单的事情。我想出了自己的“穷人分析器”类来帮助我完成这项工作,并最终减少了相当多的计算时间。
-
埃利亚斯,这很奇怪。 Mike stackoverflow.com/users/23771/mike-dunlavey 通常推荐他的未获得专利的统计证明的 5 个随机回溯 gdb 穷人分析几乎每个带有 [profiling] 标记的问题。您的 gprof 可能已损坏,操作系统是什么?您能否创建(或在 fftw lib 示例中找到)更简单的程序变体,该变体将填充一些数据并使用空 gprof 报告调用 fftw 以允许我们测试您的案例?
-
我对一个简单的主程序也有同样的问题。 Archlinux 上的 gcc 7.2.0 gprof 2.29.1。这就像不兼容的东西。
-
@IsaacPascual,你能在网上发布有问题的程序示例吗?您的程序是使用 fttw 进行大量计算还是太短了?
-
您的程序将在
std::rand函数中花费 100% 减去 epsilon 的时间,该函数尚未使用 -g 编译,是吗?因此,您的代码中基本上会出现零样本。