Ubuntu Fortran性能分析怎么做
导读:Ubuntu 下 Fortran 性能分析实操指南 一 基础准备与基线计时 安装编译器:sudo apt install gfortran。 基线计时示例(建议固定问题规模、关闭后台负载、预热后再测):program main imp...
Ubuntu 下 Fortran 性能分析实操指南
一 基础准备与基线计时
- 安装编译器:sudo apt install gfortran。
- 基线计时示例(建议固定问题规模、关闭后台负载、预热后再测):
program main implicit none real :: t0, t1, elapsed call cpu_time(t0) ! ... 被测代码 ... call cpu_time(t1) elapsed = t1 - t0 print '("Elapsed: ", F0.4, " s")', elapsed end program - 编译与运行:gfortran -O3 -o main main.f90 & & ./main。
- 建议做法:多次运行取中位数;对含 I/O 的程序,分离 I/O 与计算阶段计时;使用代表性输入规模。
- 说明:gfortran 的 -pg 与 -O3 同时开启可能带来开销或符号信息缺失,实际分析时常用“无 -pg 的 -O3 版本做热点定位,-pg 版本做调用统计”的两套构建。
二 工具链与适用场景
- gprof(调用图与函数时间占比):适合粗粒度热点定位,需重新编译加 -pg,运行生成 gmon.out,再用 gprof 生成报告。
- perf + FlameGraph(CPU 采样 + 火焰图):系统级热点与调用栈可视化,能直观看到热点函数与调用路径。
- Valgrind Massif(堆内存分配分析):定位内存分配热点与峰值占用,帮助发现大块临时分配与泄漏趋势。
- Intel 工具链(如 Intel oneAPI 的 VTune Profiler/Inspector):对 Intel 编译器与 x86 平台优化较深,适合线程与内存访问模式分析。
- Omnitrace(并行与异构应用):支持 Fortran/C/C++/HIP/OpenCL/Python,覆盖 CPU/GPU 与 MPI/Kokkos 等并行 API,提供因果分析与 Web 可视化。
三 分步操作命令
-
gprof(函数级热点与调用统计)
- 编译:gfortran -O3 -pg -o app app.f90
- 运行:./app(生成 gmon.out)
- 报告:gprof app gmon.out > gprof.txt
- 解读要点:关注“cumulative seconds”“self seconds”和调用次数,优先优化占比最高者。
-
perf + FlameGraph(火焰图)
- 安装:sudo apt install linux-tools-common linux-tools-generic linux-tools-$(uname -r)
git clone https://github.com/brendangregg/FlameGraph - 编译:gfortran -g -O3 -o app app.f90(建议保留调试符号,函数名更清晰)
- 采样记录:perf record -e cpu-clock -g ./app
- 生成火焰图:
perf script -i perf.data >
perf.unfold
FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded
FlameGraph/flamegraph.pl perf.folded > perf.svg - 查看:浏览器打开 perf.svg,横向越长表示占用越多。
- 安装:sudo apt install linux-tools-common linux-tools-generic linux-tools-$(uname -r)
-
Valgrind Massif(堆内存分配热点与峰值)
- 安装:sudo apt install valgrind
- 运行:valgrind –tool=massif ./app
- 分析:ms_print massif.out.xxxx 查看分配栈与峰值占用;也可用 massif-visualizer 图形化查看。
四 结果解读与优化建议
- 先大后小:先用 perf/火焰图 找到占用最高的外层函数,再逐层下钻到内层循环;用 gprof 验证调用次数与占比是否异常。
- 优化优先级:
- 计算强度高的循环优先做“循环展开/向量化”(编译器提示如 -O3 已部分完成,必要时结合数据布局与访问连续性优化)。
- 减少内存带宽压力:提高数据局部性(顺序访问、分块/tiling)、避免不必要的临时数组与拷贝。
- 并行化:在热点循环上评估 OpenMP/线程并行或 MPI 域分解,注意负载均衡与同步开销。
- 持续回归:每次优化后,用相同数据集与机器复测,比较“总时长/吞吐/峰值内存”等关键指标,避免优化副作用。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Fortran性能分析怎么做
本文地址: https://pptw.com/jishu/773095.html
