在 Ubuntu 上优化 Fortran 程序性能,可以从编译选项、代码层面、系统环境、并行化几个方向入手。下面按“实用优先级”给你一个较完整的优化清单。
推荐:
安装 Intel 编译器(可选):
sudo apt install intel-oneapi-compiler-fortran
gfortran -O3 -march=native -funroll-loops \
-ffast-math -ftree-vectorize \
prog.f90 -o prog
解释:
-O3:高级优化-march=native:针对本机 CPU 指令集-ffast-math:放宽浮点规则(科学计算常用)-funroll-loops:循环展开-ftree-vectorize:向量化(通常 -O3 已开)⚠ 注意:-ffast-math 可能影响数值严格性
gfortran -O3 -fopt-info-vec -c prog.f90
或:
gfortran -O3 -fopt-info-all
implicit none避免隐式类型错误和性能损失:
implicit none
✅ 推荐:
do j = 1, n
do i = 1, m
a(i,j) = b(i,j) + c(i,j)
end do
end do
❌ 避免:
do i = 1, m
do j = 1, n
Fortran 是列优先,外层循环应是第一维。
a = b + c
比显式循环更快(编译器易优化)。
call sub(a(1:n)) ! 好
call sub(a) ! 可能复制
使用 intent(in/out) 明确意图。
contiguousreal, contiguous :: a(:,:)
帮助编译器向量化。
gfortran -fopenmp prog.f90 -o prog
代码:
!$omp parallel do
do i = 1, n
a(i) = b(i)**2
end do
!$omp end parallel do
运行:
export OMP_NUM_THREADS=8
./prog
sudo apt install mpich
mpif90 prog.f90 -o prog
mpirun -np 4 ./prog
gfortran -fcoarray=lib prog.f90 -o prog
sudo cpufreq-set -g performance
查看:
lscpu
sudo sysctl vm.nr_hugepages=1024
sudo apt install libopenblas-dev
链接:
gfortran prog.f90 -lopenblas
gfortran -pg prog.f90 -o prog
./prog
gprof prog gmon.out > report.txt
sudo perf record ./prog
sudo perf report
vtune -collect hotspots ./prog
gfortran -O3 -march=native -ffast-math \
-funroll-loops -fopenmp \
prog.f90 -lopenblas -o prog
如果你愿意,可以:
我可以帮你针对性优化,甚至直接改代码。