一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Debian上如何进行Fortran并行计算

时间:2026-06-17 09:16:00 编辑:袖梨 来源:一聚教程网

Debian上Fortran并行计算实操指南

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 mainuse omp_libimplicit noneinteger :: i, n = 1000000, tid, nthreadsreal(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 dodo i = 1, nx = dble(i)s = s + x*xend do!$omp end do!$omp end parallel

      if (omp_get_thread_num() == 0) thenprint ‘("Threads = ", i0, "Sum = ", f0.0)’, nthreads, send ifend 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 mainuse mpi_f08implicit nonetype(MPI_Comm) :: comminteger :: rank, size, ierrreal(kind=8) :: t0, t1

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

      call cpu_time(t0)! 示例:各进程计算局部求和 1…(rank+1)*1000blockinteger :: i, local_nreal(kind=8) :: local_sum, global_sumlocal_n = (rank + 1) * 1000local_sum = 0.0d0do i = 1, local_nlocal_sum = local_sum + dble(i)end docall MPI_Reduce(local_sum, global_sum, 1, MPI_DOUBLE_PRECISION, &MPI_SUM, 0, comm, ierr)call cpu_time(t1)if (rank == 0) thenprint ‘("Rank ", i0, “/”, i0, "Local sum = ", f0.0, "Global sum = ", f0.0)’, &rank, size, local_sum, global_sumprint ‘("Elapsed time = “, f0.3, " s”)’, t1 - t0end ifend 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=cores、OMP_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 实现配套。

热门栏目