前几天在实验室做了几个小实验,受益匪浅,写代码倒是其次,最重要的是渐渐了解了真实的 计算机科学 工作方式。
很多工作都可以用 linux 下的工具高效完成,例如 要跑一组实验,其中有两个参数变动,那么就不需要手动运行多次,只用一个 Shell Script 就能完成。配合 awk 效率更高。
其中两个工具真得很受用,一个是 GDB, 一个是 perf。前者用于程序调试,后者用于程序性能侦测。
GDB 是linux下很出色的调试器, 很多常用的调试工具,例如 breakpoint, call stack 都有很好的实现。
对于 GDB, 推荐阅读这个 tutorial, 非常好,尤其是后面集成的针对 STL 的 pcontainer 方法。
对于之前经常发生的段错误 SF, 以及经常出现的 core dump,都能用 GDB 准确定位。只不过,在使用 g++ 编译的时候,要加上 -ggdb 参数,同时尽量不要打开优化,否则编译器很难记录每个符号。
perf 是内置在 linux 内核里的一个程序性能侦测工具。具体源码应该可以在 kernel 里找到。
之前使用一个图系统跑实验,发现多线程性能不佳,但是不能找到瓶颈,使用 perf 就能轻易看到,是 omp_barrier_wait_end,通过搜索能知道这个函数是 OpenMP 的同步方法,那么就能推断出问题出在 OpenMP 的任务分配上,不均衡的任务分配导致不均衡的计算时间。
perf 内置了多个工具,具体内容可以参看 man perf,其中最重要的两个是 report 和 record。
类似于 time 命令一样, 在程序前面加上 perf record, 可以生成一个报告,这个报告能够显示在程序此次运行里每个函数占用的时间比,一般报告的后缀名都是 .perf.data 。
生成报告之后就用 perf report,这个工具能够分析 record 生成的报告,显示具体的函数占用时间排名。