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的使用方法。
操作步骤
包含头文件并初始化。
PETSc
#include <petscksp.h> PetscInitialize(&argc, &argv, NULL, NULL);
HYPRE
#include <HYPRE.h> #include <HYPRE_parcsr_ls.h> HYPRE_Init(argc, argv);
创建向量和矩阵对象,并设置它们的大小和结构。
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);
设置线性方程组的系数矩阵和右端向量。
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);
选择求解器和预处理器,并设置它们的参数。
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);
调用求解函数求解线性方程组。
PETSc
KSPSolve(ksp, b, x);
HYPRE
HYPRE_ParCSRGMRESSolve(solver, A, b, x);
销毁对象并释放内存。
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的 MatSetValues 和 MatView 函数。
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求解器运行参数,实现了两个软件库的联和使用。