文章目录
- PETSc架构介绍和解释
- PETSc软件架构
- PETSc数值计算库架构
- PETSc底层核心数学对象(Mat&Vec)
- 细节
- PETSc并行、GPU异构计算支持(MPI&Thread&GPU)
- PETSc并行分布式通信组件: PetscSF
- PETSc和第三方库接口(interfaces)
- 官方资料
PETSc架构介绍和解释
PETSc软件架构
PETSc核心是为学科领域内的ODE方程和PDE方程提供数值计算工具Toolkit, 同时配备有完整程序开发需要的日志、调试、优化等功能。
| 说明 | 备注 |
|---|---|
| 工具 | 运行选项、调试和性能工具、可视化工具等 |
| 数学计算 | 矩阵、向量、线性/非线性求解器、优化算法求解器等 |
| 底层依赖库 | BLAS、LAPACK、MPI、CUDA、CL等 |
PETSc数值计算库架构
| 说明 | 备注 |
|---|---|
| 基础数学对象 | Mat,Vec,Index |
| 几何拓扑对象管理 | DMDA、DMPlex |
| 稀疏矩阵迭代求解器 | KSP、PC |
| 非线性方程求解器 | SNES |
| 优化求解器 | TAO |
| 时间域求解器 | TS |
另一张架构截图
PETSc底层核心数学对象(Mat&Vec)
- 完全面向对象设计,支持多态
- 对上层应用(e.g.,KSP)提供统一抽象通用接口(e.g., Add,Sub,Mul等)
- 支持运行时配置(options)
- 支持串行(SEQ)和并行分布式(MPI)数据布局
- 提供第三方扩展插件集成(e.g., CUSPARSE)
核心对象: Mat,Vec,IS
细节
8个进程的Vec和Mat存储示意图: 矩阵向量乘法
- Vec以分布式方式存储在多个MPI进程上
- 稀疏矩阵以AIJ(CSR)格式存储。对MPI多进程,稀疏矩阵在ROW方向上进行划分,每个进程内会将对角部分(diagonal block)和非对角部分(off-diagonal block)分开存储
- 通过IS(Index Sets)提供复杂索引操作(e.g.,gather/scatter)
稀疏矩阵整体上按ROW划分,每个进程内分成对角块和非对角块,配合Vec向量划分,可以实现计算和通信重叠: 对角块和本地向量部分进行SpMV计算,同时可接收其他进程的Vec部分数据(PETSc是为超大规模并行环境设计的,必需考虑网络通信因素)。对比HYPRE的稀疏矩阵划分, 内部只用一个CSR表示,所以通过PETSc调用HYPRE功能,会有内部矩阵格式转换开销.
PETSc并行、GPU异构计算支持(MPI&Thread&GPU)
- 以"shared nothing"原则设计
- 分布式计算主要基于MPI进程间显示通信设计。有基于MPI和NVSHMEM的通信组件PetscSF
- 对多线程(OpenMP/Threads)提供有限支持
- 以扩展插件形式支持GPU异构计算(3.17版本已经集成CUSPARSE和ViennaCL)
较新版本支持AMGX(PCAMGX)
PETSc并行分布式通信组件: PetscSF
- 聚焦全局Array&Vec复杂数据交换场景
- 基于Star Forest Graph图拓扑设计进程间通信模式
- 基于MPI one-sided RMA和two-sided P2P通信原语
- 基于NVSHMEM,支持多GPU卡硬件环境
核心计算是SpMV和向量内积, 核心通信是不规则All-to-All通信和Allreduce。PetscSF官方手册
PETSc和第三方库接口(interfaces)
- PETSc采用插件(plugin)设计方式,可以和多种第三方软件进行集成。集成的工作主要在核心对象Mat&Vec进行格式转换对接,PETSc无需知道对方源码细节.
- 有非常多的第三方集成案例. 常见第三方集成:HYPRE、HPDDM、MUMPS、SuperLU、AMGCL、AMGX、OpenFOAM等
官方资料
- API Doc
- 所有支持的Vector形式
- 所有支持的Matrix形式