我尝试用gprof分析我的C++程序.程序本身运行了大约53秒,所以我不明白为什么它说,主要只运行了大约8.29秒.对此有何解释?
这是一段摘录:
index % time self children called name
<spontaneous>
[2] 20.5 0.00 8.29 main [2]
0.00 8.28 1/1 MPQS::start(std::basic_ofstream<char, std::char_traits<char> >&) [3]
0.00 0.01 1/1 MPQS::MPQS(NTL::ZZ, long) [36]
0.00 0.00 1/1 MPQS::~MPQS() [78]
-----------------------------------------------
0.00 8.28 1/1 main [2]
[3] 20.5 0.00 8.28 1 MPQS::start(std::basic_ofstream<char, std::char_traits<char> >&) [3]
7.15 1.08 801/801 MPQS::sieve() [4]
0.00 0.04 801/801 MPQS::find_smooth_vals() [23]
0.01 0.00 1/1 MPQS::try_solutions(NTL::mat_GF2&) [35]
0.00 0.00 801/801 MPQS::compute_coeffecients() [59]
-----------------------------------------------
7.15 1.08 801/801 MPQS::start(std::basic_ofstream<char, std::char_traits<char> >&) [3]
[4] 20.4 7.15 …Run Code Online (Sandbox Code Playgroud) 我有一个在嵌入式处理器(ARM)上运行的应用程序,我想分析应用程序,以了解它在哪里使用系统资源,如CPU,内存,IO等.应用程序运行在Linux,所以我假设有许多可用的分析应用程序.有没有人有什么建议?
谢谢!
编辑:我还应该添加我们使用的Linux版本有些旧(2.6.18).不幸的是,我现在没有很多控制权.
我正在寻找一种用C语言描述我的openMPI程序的方法,我正在使用带有Linux Ubuntu 9.10的openMPI 1.3,我的程序是在Intel Duo T1600下运行的.
我想要的是在程序的任何部分中的缓存未命中,内存使用和执行时间.
谢谢你的答复
我需要一种更好的方法来分析数字代码。假设我在 64 位 x86 上的 Cygwin 中使用 GCC,并且我不打算购买商业工具。
情况是这样的。我有一个函数在一个线程中运行。除了内存访问之外,没有任何代码依赖性或 I/O,可能有一些数学库的链接是例外。但在大多数情况下,所有这些都是表查找、索引计算和数值处理。我已经缓存对齐堆和堆栈上的所有数组。由于算法的复杂性、循环展开和长宏,汇编列表可能会变得很长——数千条指令。
我一直在求助于使用 Matlab 中的 tic/toc 计时器、bash shell 中的时间实用程序,或者直接在函数周围使用时间戳计数器 (rdtsc)。问题是这样的:时间的方差(可能高达运行时间的 20%)大于我正在做的改进的大小,所以我无法知道代码是更好还是更糟改变后。你可能会认为是时候放弃了。但我不同意。如果您坚持不懈,许多渐进式改进可以带来两到三倍的性能提升。
我多次遇到的一个特别令人抓狂的问题是我进行了更改,并且性能似乎持续提高了 20%。第二天,收益就消失了。现在有可能我对代码进行了我认为无害的更改,然后完全忘记了它。但我想知道是否有可能发生其他事情。就像 GCC 可能不会像我相信的那样产生 100% 的确定性输出。或者可能是更简单的事情,比如操作系统将我的进程移到了一个更繁忙的核心。
我已经考虑了以下内容,但我不知道这些想法中的任何一个是否可行或有意义。如果是,我需要有关如何实施解决方案的明确说明。 目标是最小化运行时的差异,以便我可以有意义地比较优化代码的不同版本。
过去,我通过计算汇编列表中的指令在 RISC 架构上取得了成功。当然,这只适用于指令数量很少的情况。某些编译器(如 TI 的 C67x 代码编辑器)将为您详细分析它如何使 ALU 保持忙碌。
我还没有发现 GCC/GAS 生成的程序集列表特别有用。随着全面优化,代码被移动到所有地方。对于分散在汇编列表中的单个代码块,可以有多个位置指令。此外,即使我能理解程序集如何映射回我的原始代码,我也不确定现代 x86 机器上的指令数和性能之间是否有很大的相关性。
我尝试使用 gcov 进行逐行分析,但由于我构建的 GCC 版本与 MinGW 编译器不兼容,因此无法正常工作。
您可以做的最后一件事是在多次试运行中取平均值,但这需要很长时间。
编辑(RE:调用堆栈采样)
我的第一个问题是,实际上,我该怎么做?在你的一张幻灯片中,你展示了使用 Visual Studio 暂停程序。我拥有的是由 GCC 编译的 DLL,并在 Cygwin 中进行了全面优化。然后由 Matlab 使用 VS2013 编译器编译的 mex DLL 调用它。
我使用 Matlab 的原因是因为我可以轻松地试验不同的参数并将结果可视化,而无需编写或编译任何低级代码。此外,我可以将优化的 …
根据我的说法,我运行gprof了一个C++程序,我得到了第一行输出:16.637stime()
% cumulative self self total
time seconds seconds calls s/call s/call name
31.07 0.32 0.32 5498021 0.00 0.00 [whatever]
Run Code Online (Sandbox Code Playgroud)
为什么31.07%它只花了.32几秒钟的时间列表?这是一次通话时间吗?(这不是自我/电话吗?)
这是我第一次使用gprof,所以请善待:)
编辑:通过向下滚动,似乎gprof认为我的程序需要1.03秒.为什么会这么错呢?
当我在我的C程序上运行gprof时,它表示我的程序没有累积时间,并显示所有函数调用的0时间.但它会计算函数调用.
如何修改我的程序,以便gprof能够计算运行所需的时间?
对于在我们手动重启机器之前从未退出的应用程序分析我有一个小小的疑问.
我使用像valgrind这样的工具来讨论内存泄漏或任何在某个时间后退出的应用程序的膨胀.
但有没有任何工具可以用来告诉应用程序在各个阶段创建的内存消耗,膨胀和开销,如果可能的话?
注意:我更感兴趣的是了解不退出的应用程序...如果应用程序退出,我可以使用像valgrind这样的工具..
什么是.NET 4.0的优秀分析器?我愿意花一些钱,但不要太多(说高达50英镑)
我正在使用XNA为windows phone和xbox开发游戏,这意味着这些项目是商业化的.我提到它是因为我看过几个免费用于非商业用途.
Visual Studio集成的额外要点.
铌.我正在使用Visual Studio Professional 2010
似乎Ants剖析器在完全相同的时间进行了检测和代码采样,我发现它非常有趣
我使用了VS分析器,你必须运行两个不同的配置文件会话来识别瓶颈 - ANTS如何捕获IO绑定函数调用而无需修改代码并将代码注入编译函数?
编辑:蚂蚁是使用仪器还是采样?
我有一些使用intel fortran编译器ifort编译的fortran代码.当我使用gprof进行配置文件测试时,我得到的大部分时间用于IO操作,我想找到文件的结尾,但我找不到更多关于此的文档:
index % time self children called name
<spontaneous>
[1] 20.6 0.07 0.00 _IO_wfile_seekoff [1]
-----------------------------------------------
<spontaneous>
[2] 20.6 0.07 0.00 sforcepf_ [2]
-----------------------------------------------
<spontaneous>
[3] 20.6 0.02 0.05 _IO_wfile_underflow [3]
0.01 0.04 258716/258717 strncmp [4]
-----------------------------------------------
0.00 0.00 1/258717 _IO_wdefault_doallocate [15]
0.01 0.04 258716/258717 _IO_wfile_underflow [3]
[4] 14.7 0.01 0.04 258717 strncmp [4]
0.04 0.00 3104592/3109256 strerror_r [5]
-----------------------------------------------
0.00 0.00 4664/3109256 __strcmp_sse42 [14]
0.04 0.00 3104592/3109256 strncmp [4]
[5] 11.8 0.04 0.00 3109256 strerror_r [5]
-----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
那么,问题是,这个IO是针对Linux,还是针对ifort,还是针对fortran?我正在尝试优化此代码,并且在google中找不到有关此条款的有用信息.