温馨提示×

Debian上如何进行Fortran并行计算

小樊
33
2025-12-20 20:44:44
栏目: 智能运维

Debian上Fortran并行计算实操指南

一 环境准备

  • 安装基础编译器与并行库(任选其一或两者皆装):
    • 编译器:gfortran
    • 共享内存并行:libomp-dev(OpenMP 运行时)
    • 分布式内存并行:openmpi-bin libopenmpi-dev(Open MPI)
  • 一条命令快速到位:
    • sudo apt update
    • sudo apt install gfortran libomp-dev openmpi-bin libopenmpi-dev
  • 验证安装:
    • gfortran --version
    • which mpif90 && mpif90 --version
    • which mpirun && mpirun --version 上述安装与验证步骤适用于Debian/Ubuntu等基于 APT 的发行版,命令与包名保持一致。

二 方法一 OpenMP 共享内存并行

  • 典型场景:单机多核加速,循环级并行、归约、临界区等。
  • 编译与运行要点:
    • 编译:gfortran -fopenmp -O3 -o omp_demo omp_demo.f90
    • 运行:./omp_demo(可配合环境变量控制线程数)
  • 最小示例 omp_demo.f90:
    • program main use omp_lib implicit none integer :: i, n = 1000000, tid, nthreads real(kind=8) :: s, x

      s = 0.0d0 !$omp parallel private(tid,x) shared(s,n) reduction(+:s) tid = omp_get_thread_num() nthreads = omp_get_num_threads() !$omp do do i = 1, n x = dble(i) s = s + x*x end do !$omp end do !$omp end parallel

      if (omp_get_thread_num() == 0) then print ‘("Threads = ", i0, " Sum = ", f0.0)’, nthreads, s end if end program main

  • 线程数控制(Linux 常见方式):
    • 环境变量:export OMP_NUM_THREADS=8
    • 运行时提示:export OMP_DISPLAY_ENV=TRUE
    • 绑定策略(可选):export OMP_PLACES=cores;export OMP_PROC_BIND=close/spread
  • 提示:避免在并行区内频繁 I/O;对 reduction、critical、atomic 的使用保持最小化与正确性。

三 方法二 MPI 分布式内存并行

  • 典型场景:多进程跨节点/多机计算,矩阵分块、域分解等。
  • 安装与工具链:openmpi-bin libopenmpi-dev(已在上节准备)。
  • 编译与运行要点:
    • 编译:mpif90 -O3 -o mpi_demo mpi_demo.f90
    • 本地运行:mpirun -np 4 ./mpi_demo
    • 多机运行:mpirun --hostfile hosts -np N ./mpi_demo(hosts 列出节点)
  • 最小示例 mpi_demo.f90(Fortran 2008 接口):
    • program main use mpi_f08 implicit none type(MPI_Comm) :: comm integer :: rank, size, ierr real(kind=8) :: t0, t1

      call MPI_Init(ierr) comm = MPI_COMM_WORLD call MPI_Comm_rank(comm, rank, ierr) call MPI_Comm_size(comm, size, ierr)

      call cpu_time(t0) ! 示例:各进程计算局部求和 1…(rank+1)*1000 block integer :: i, local_n real(kind=8) :: local_sum, global_sum local_n = (rank + 1) * 1000 local_sum = 0.0d0 do i = 1, local_n local_sum = local_sum + dble(i) end do call MPI_Reduce(local_sum, global_sum, 1, MPI_DOUBLE_PRECISION, & MPI_SUM, 0, comm, ierr) call cpu_time(t1) if (rank == 0) then print ‘("Rank ", i0, “/”, i0, " Local sum = ", f0.0, " Global sum = ", f0.0)’, & rank, size, local_sum, global_sum print ‘("Elapsed time = “, f0.3, " s”)’, t1 - t0 end if end block

      call MPI_Finalize(ierr) end program main

  • 多机快速配置要点:
    • 各节点互通(/etc/hosts 或 DNS 正确解析)
    • 配置 SSH 免密登录(ssh-keygen;ssh-copy-id user@node)
    • 使用 Open MPI 时,推荐通过 mpirun/mpiexec 启动;必要时设置 PATH/LD_LIBRARY_PATH 指向 MPI 安装。

四 多节点与性能优化建议

  • 进程绑定与亲和性:
    • OpenMP:设置 OMP_PLACES=coresOMP_PROC_BIND=close/spread 减少线程迁移开销。
    • MPI:使用进程绑定参数(如 Open MPI 的 --bind-to core/socket)提升缓存命中与通信局部性。
  • 网络与进程布局:
    • 同机多进程优先绑定到不同 NUMA 节点/物理核心;跨节点时确保互联(如以太网/InfiniBand)低延迟与带宽。
  • I/O 与归约:
    • 并行 I/O(如 MPI-IO)替代各进程各自写文件;归约/广播尽量使用库例程(MPI_Reduce/MPI_Allreduce)。
  • 线程与进程配比:
    • 经验上,每节点总线程数≈物理核心数;MPI 进程数×每进程 OpenMP 线程数不宜超过物理核心数过多,避免超订。
  • 数值库选择:
    • 线性代数可结合 BLAS/LAPACK/SCALAPACK;若需跨进程并行线性代数,优先使用 SCALAPACK 与相应 MPI 实现配套。

0