9. 高性能求解器适配

9.1. PETSc与HYPRE

PETSc和HYPRE都是用于求解大规模科学计算问题的软件库,都支持使用GPU进行加速计算。

PETSc(Portable, Extensible Toolkit for Scientific Computation)是一个高性能、可扩展的数值计算软件库。 它提供了许多常用的求解器和预处理器,如共轭梯度法、GMRES、LU分解等。PETSc支持串行、并行和分布式计算,并且可以与许多其他软件库和工具集集成使用。

HYPRE(High Performance Preconditioners)是一个预处理器库。 它提供了多种预处理器,如BoomerAMG、Euclid、ParaSails等,可以用于求解线性和非线性方程组。HYPRE也支持串行、并行和分布式计算,并且可以与PETSc等其他软件库和工具集集成使用。

9.2. PETSc与HYPRE的使用

PETSc和HYPRE使用步骤基本一致,代码调用有所区别。以求解Ax=b为例,以下操作步骤演示了PETSc和HYPRE的使用方法。

操作步骤

  1. 包含头文件并初始化。

    • PETSc

      #include <petscksp.h>
      PetscInitialize(&argc, &argv, NULL, NULL);
      
    • HYPRE

      #include <HYPRE.h>
      #include <HYPRE_parcsr_ls.h>
      HYPRE_Init(argc, argv);
      
  2. 创建向量和矩阵对象,并设置它们的大小和结构。

    • PETSc

      Mat A;
      Vec x, b;
      MatCreate(PETSC_COMM_WORLD, &A);
      VecCreate(PETSC_COMM_WORLD, &x);
      VecCreate(PETSC_COMM_WORLD, &b);
      
    • HYPRE

    HYPRE_IJMatrix A;
    HYPRE_IJVector x, b;
    HYPRE_IJMatrixCreate(MPI_COMM_WORLD, 0, n-1, 0, n-1, &A);
    HYPRE_IJVectorCreate(MPI_COMM_WORLD, 0, n-1, &x);
    HYPRE_IJVectorCreate(MPI_COMM_WORLD, 0, n-1, &b);
    
  3. 设置线性方程组的系数矩阵和右端向量。

    • PETSc

      MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n);
      VecSetSizes(x, PETSC_DECIDE, n);
      VecSetSizes(b, PETSC_DECIDE, n);
      MatSetFromOptions(A);
      VecSetFromOptions(x);
      VecSetFromOptions(b);
      
    • HYPRE

      HYPRE_IJMatrixSetObjectType(A, HYPRE_PARCSR);
      HYPRE_IJVectorSetObjectType(x, HYPRE_PARCSR);
      HYPRE_IJVectorSetObjectType(b, HYPRE_PARCSR);
      HYPRE_IJMatrixInitialize(A);
      HYPRE_IJVectorInitialize(x);
      HYPRE_IJVectorInitialize(b);
      
  4. 选择求解器和预处理器,并设置它们的参数。

    • PETSc

      KSP ksp;
      KSPCreate(PETSC_COMM_WORLD, &ksp);
      KSPSetOperators(ksp, A, A);
      KSPSetType(ksp, KSPCG);
      KSPSetTolerances(ksp, 1e-8, PETSC_DEFAULT, PETSC_DEFAULT, PETSC_DEFAULT);
      PC pc;
      KSPGetPC(ksp, &pc);
      PCSetType(pc, PCJACOBI);
      
    • HYPRE

      HYPRE_Solver solver;
      HYPRE_ParCSRGMRESCreate(MPI_COMM_WORLD, &solver);
      HYPRE_ParCSRGMRESSetTol(solver, 1e-6);
      HYPRE_ParCSRGMRESSetMaxIter(solver, 1000);
      HYPRE_ParCSRGMRESSetup(solver, A, b, x);
      
  5. 调用求解函数求解线性方程组。

    • PETSc

      KSPSolve(ksp, b, x);
      
    • HYPRE

      HYPRE_ParCSRGMRESSolve(solver, A, b, x);
      
  6. 销毁对象并释放内存。

    • PETSc

      VecDestroy(&x);
      VecDestroy(&b);
      MatDestroy(&A);
      KSPDestroy(&ksp);
      PetscFinalize();
      
    • HYPRE

      HYPRE_ParCSRGMRESDestroy(solver);
      HYPRE_IJMatrixDestroy(A);
      HYPRE_IJVectorDestroy(x);
      HYPRE_IJVectorDestroy(b);
      HYPRE_Finalize();
      

上述步骤中忽略了值设置以及一些打印过程,PETSc和HYPRE均提供了通用的向量和矩阵值输入和输出函数,例如PETSc的 MatSetValuesMatView 函数。

PETSc已经将HYPRE集成到求解器中。 例如,如果使用PETSc的CG求解器并调用HYPRE的求解器来处理预条件子,可以结合两个软件库的求解器以达到性能最优,在PETSc已经将求解过程撰写完毕之后,用户可以修改 KSPSetType 函数为 KSPSetFromOptions 函数以选择暴露KSP求解器设置端口,在运行程序时输入以下参数:

- ksp_type cg
      - pc_type hypre
      - pc_hypre_type boomeramg
      - pc_hypre_boomeramg_max_iter "1"
      - pc_hypre_boomeramg_strong_threshold "0.25"
      - pc_hypre_boomeramg_grid_sweeps_up "1"
      - pc_hypre_boomeramg_grid_sweeps_down "1"
      - pc_hypre_boomeramg_agg_nl "1"
      - pc_hypre_boomeramg_agg_num_paths "1"
      - pc_hypre_boomeramg_max_levels "25"
      - pc_hypre_boomeramg_coarsen_type PMIS
      - pc_hypre_boomeramg_interp_type ext+i
      - pc_hypre_boomeramg_P_max "1"
      - pc_hypre_boomeramg_truncfactor "0.3"

从而在PETSc运行CG算法时,preconditioner算法使用HYPRE的BoomerAMG,并详细设置HYPRE BoomerAMG求解器运行参数,实现了两个软件库的联和使用。