在 Ubuntu 下优化 Fortran 程序的性能,通常可以从编译器选项、代码层面、并行化、系统环境几个方面入手。下面按优先级和可操作性给你一个较系统的清单。
Ubuntu 上常用 Fortran 编译器:
gfortran -O3 -march=native -funroll-loops \
-ffast-math -ftree-vectorize prog.f90 -o prog
说明:
-O3:高级优化-march=native:针对本机 CPU 指令集-ffast-math:牺牲部分精度换速度(科学计算常用)-funroll-loops:循环展开⚠️ 若涉及严格数值一致性(如某些 PDE/随机数),慎用
-ffast-math
ifort -O3 -xHost -ipo -vec-report prog.f90 -o prog
通常比 gfortran 快 10–50%。
❌ 错误示例:
b = a(1:n:2)
✅ 用指针或显式循环更好。
inlinedo concurrent(Fortran 2008+,利于并行)do concurrent (i=1:n)
a(i) = b(i) + c(i)
end do
Fortran 是列优先:
do j = 1, m
do i = 1, n
a(i,j) = ...
end do
end do
✅ 正确
❌ 反过来会严重 cache miss
allocate(a(n), stat=ierr)
尽量在程序开始一次分配。
gfortran -fopenmp prog.f90 -o prog
代码:
!$omp parallel do
do i = 1, n
a(i) = b(i)*c(i)
end do
!$omp end parallel do
适合大规模科学计算(如气象、流体)。
gfortran -O3 -fopt-info-vec -march=native prog.f90
看哪些循环被向量化。
用优化过的 BLAS / LAPACK:
sudo apt install libopenblas-dev liblapack-dev
编译时:
gfortran prog.f90 -lopenblas -llapack -o prog
或 Intel MKL(更快)。
sudo cpufreq-set -g performance
echo 1024 | sudo tee /proc/sys/vm/nr_hugepages
write(10) a
gprofgfortran -pg prog.f90 -o prog
./prog
gprof prog gmon.out
perfperf record ./prog
perf report
-O3 -march=native如果你愿意,可以:
我可以给你针对性的重构和优化示例。