并行加速场景详解:什么方程、矩阵和步骤适合什么方法 / Mapping Equations, Matrices, and Solver Stages to Parallel Methods
📅 创建时间:2026-07-20 🏷️ 标签:#并行求解 #CPU #GPU #MPI #稀疏线性代数 📚 前置知识:[[12-serial-and-algorithmic-acceleration]] 📚 相关知识:[[/02-systems-and-performance/03-parallel-computing/09-distributed-parallelism]] [[/02-systems-and-performance/03-parallel-computing/10-performance-engineering]]
1. 工业计算的并行层次
工况级并行 多个航速、载荷、频率互相独立
时间/阶段并行 流水线、部分并行时间算法
域级并行 网格和矩阵划分到多个进程
线程级并行 单元、控制体、矩阵行分给 CPU 线程
向量级并行 SIMD 一次处理多个数值
设备级并行 GPU 大规模线程越靠上通常越容易实现、通信越少。优先利用工况级并行,再考虑复杂的单个算例内部并行。
2. 参数扫描和多工况
场景
- 多个船速
- 多个螺旋桨转速
- 多个攻角或来流方向
- 多个静力载荷组合
- 多个材料参数
- 多个频率点
特点
任务基本独立,属于 Embarrassingly Parallel。
适合方法
- 多进程任务队列
- 集群作业数组
- 多 GPU 分配不同工况
- 云端批处理
这是扩展效率最高的一类并行。
3. 网格生成
可并行部分
- 表面几何检查
- 局部尺寸场计算
- 八叉树细分
- 网格质量评估
- 各区域独立网格
难点
- 保证区域接口一致
- 全局拓扑修改
- 网格点合并
- 负载随几何复杂度不均
方法
- CPU 任务并行/TBB/OpenMP
- 空间分区
- 分区网格后接口协调
GPU 对规则体素和距离场处理有优势,但复杂 CAD 拓扑操作通常更适合 CPU。
4. FEA 单元积分
每个单元的刚度、质量和内力计算大多独立:
for each element:
读取节点坐标和状态
高斯积分
计算 Ke / Me / fint适合方法
- CPU 多线程
- SIMD 批量处理相同单元类型
- GPU 每个线程块处理一个或多个单元
难点
- 不同单元类型工作量不同
- 塑性材料存在分支
- 数据布局不连续
- 组装到全局矩阵时写冲突
5. 全局矩阵组装
多个单元可能同时写入同一个全局矩阵位置。
方法一:原子加
简单,但高竞争区域性能可能下降。
方法二:图着色
把不共享自由度的单元放在同一颜色中并行计算,不需要原子写。
方法三:线程局部缓冲
各线程先写本地贡献,最后合并。
方法四:先生成 COO 条目再排序归并
适合 GPU 批量生成,但需要额外排序和内存。
方法五:Matrix-Free
不显式组装 K,直接计算 y=Kx,减少内存和写冲突,适合高阶有限元和 GPU。
6. 稀疏矩阵向量乘 SpMV
y = Ax它是 CG、GMRES、CFD 迭代和多重网格中的核心操作。
特点
- 每行大多独立
- 计算量小
- 需要读取大量矩阵值、索引和向量
- 通常受内存带宽限制
CPU
- 多线程按行划分
- NUMA 本地化
- BSR 提高结构块复用
- SIMD 对规则块有效
GPU
- 大量线程并行处理行或非零项
- CSR、SELL、BSR 等格式
- 需要处理行长度不均和不规则
x访问
增加 GPU 浮点峰值并不一定提高 SpMV,因为瓶颈通常是显存带宽。
7. 向量操作和归约
Krylov 方法包含:
y=ax+y- 点积
- 范数
- 多向量正交化
局部向量操作容易并行,但点积需要全局归约。
在 MPI 集群中:
每个进程计算局部点积
→ MPI_AllReduce
→ 所有进程获得全局结果强扩展到很多节点后,AllReduce 延迟可能成为瓶颈。
可考虑:
- Pipelined CG/GMRES
- Communication-Avoiding Krylov
- 合并多个归约
8. CG
适合 SPD,例如约束充分的线性弹性和部分泊松问题。
并行性
- SpMV:高
- 向量更新:高
- 点积:需要归约
- 预条件器:决定整体并行效率
GPU
适合大规模系统,但小矩阵启动成本可能超过收益。
MPI
每次 SpMV 需要交换子域边界向量,每轮还需要全局点积。
9. GMRES/BiCGSTAB
适用于非对称 CFD 输运系统。
GMRES 难点
- Krylov 基向量不断增加
- 正交化包含多次点积
- 内存和全局归约成本高
重启 GMRES 限制内存,但可能降低收敛速度。
BiCGSTAB
内存较少,点积和 SpMV 数量固定,但收敛可能不规则。
10. Jacobi 预条件
只读取对角线:
z_i = r_i / a_ii几乎完全并行,适合 GPU,但对复杂网格和高条件数系统加速有限。
块 Jacobi 让每个节点或子域求解小块,效果更好且仍有较好并行性。
11. ILU/IC
不完全分解具有数据依赖:
前向三角求解 → 后向三角求解并行方法
- Level Scheduling
- 多色 ILU
- Block ILU
- 子域内 ILU + 域间迭代
GPU 上三角求解并行性通常低于 SpMV。ILU 收敛好并不代表端到端速度一定最好。
12. 多重网格 AMG
AMG 包含:
- 平滑
- 限制
- 粗网格算子
- 粗网格求解
- 插值
优势
对压力泊松、扩散、弹性问题常具有接近线性复杂度。
并行难点
- 粗网格未知量少,并行度下降
- 构造层次成本高
- 跨进程粗化和插值通信复杂
适用
- MarineFlow 压力方程
- SAM 大型线性弹性
- 隐式动力有效刚度
13. 稀疏直接法
直接分解可并行化:
- 消去树不同分支并行
- Front 内使用稠密 BLAS
- 多线程矩阵分解
- 多节点分布式 Front
适合
- 中等规模、高鲁棒性要求
- 多右端项
- 复杂接触或病态问题
限制
- Fill-in 导致内存快速增长
- 通信和任务依赖复杂
- GPU 通常加速内部稠密块,而不是整个不规则过程
14. 特征值求解
Lanczos/Arnoldi
主要并行核:
- SpMV
- 线性求解
- 向量正交化
低阶少量模态时,直接分解加速很有效;求大量模态时,正交化和内存会增大。
LOBPCG
以块向量处理多个特征对,适合并行 BLAS、GPU 和预条件器。
15. 显式动力
每个时间步主要执行:
- 单元内力
- 接触搜索和接触力
- 节点力归并
- 对角质量更新
高度适合 GPU 和多核。
瓶颈
- 最小单元控制时间步
- 接触负载不均
- 极多时间步
- 结果输出
16. CFD 方程循环
每个时间步/外迭代:
更新通量和系数
→ 求速度
→ 求压力
→ 修正速度
→ 求湍流
→ 求相分数域分解 MPI 是最常见并行方式。每个进程保存自己的网格和矩阵行,在分区边界交换 Ghost Cell 数据。
压力方程的全局耦合最强,往往决定 CFD 扩展效率。
17. 后处理并行
适合并行:
- 每单元应力恢复
- 云图变量计算
- 时间平均
- 表面积分
- 不同时间步转换
- 粒子/流线批量积分
但超大结果读取可能受磁盘带宽限制。应优先采用并行 I/O、分块读取和在线统计。
18. 场景总表
| 场景 | 数学核心 | 首选方法 | 主要瓶颈 |
|---|---|---|---|
| 多航速/多工况 | 独立任务 | 多进程/集群任务 | 调度、许可证、I/O |
| FEA 单元积分 | 小型稠密运算 | CPU SIMD/GPU | 数据布局、分支 |
| FEA 组装 | Scatter 累加 | 着色/原子/Matrix-Free | 写冲突 |
| 结构静力 SPD | Ku=f | CG+AMG 或 Cholesky | 内存、预条件 |
| CFD 压力 | 泊松型系统 | AMG+CG/其他 Krylov | 粗网格、通信 |
| CFD 输运 | 非对称系统 | GMRES/BiCGSTAB+预条件 | SpMV、归约 |
| 模态 | 广义特征值 | Lanczos/LOBPCG | 线性求解、正交化 |
| 非线性隐式 | 多次切线系统 | 多线程组装+并行求解 | 重组装、收敛 |
| 显式碰撞 | 局部更新 | GPU/多核 | 时间步、接触 |
| 多节点 CFD/FEA | 域分解 | MPI | Halo、AllReduce |
| 后处理 | 数组与几何操作 | 多线程/GPU | I/O |
下一篇:[[14-cpu-gpu-mpi-architecture]]