CPU、GPU 与 MPI:工业求解器怎样组合多层并行 / Combining CPU, GPU, and MPI Parallelism in Industrial Solvers
📅 创建时间:2026-07-20 🏷️ 标签:#异构求解 #MPI #GPU #CPU多核 #工业求解器 📚 前置知识:[[13-parallel-acceleration-map]]
1. 典型计算节点
text
一台节点
├─ 多核 CPU
├─ 多级 Cache
├─ NUMA 内存
├─ 1~多张 GPU
├─ 本地 SSD
└─ 高速网络工业求解器通常同时使用多个层次,而不是只使用一种并行技术。
2. 单机 CPU 模式
text
一个进程
└─ 多个线程
├─ 单元/网格循环
├─ 稀疏矩阵操作
├─ 后处理
└─ 文件解析优点:共享内存编程简单、无需网络通信。
注意:
- 线程数不应盲目超过有效核心数
- 内存带宽可能先饱和
- NUMA 远程访问会降低性能
- 数学库内部可能已经启动线程
3. 单机多进程模式
OpenFOAM 常使用 MPI,即使所有进程位于同一台机器。
优点:
- 与多节点模型一致
- 各进程地址空间隔离
- 域分解逻辑清晰
代价:
- 子域边界通信
- 多份元数据
- 多个结果目录
- 进程管理复杂
4. GPU Offload 模式
text
CPU
├─ 网格、控制和任务调度
├─ 复杂逻辑
└─ 准备数据
↓
GPU
├─ SpMV
├─ 向量操作
├─ 单元积分
├─ 显式更新
└─ 部分预条件器为了获得收益,应尽量让矩阵和向量长期停留在显存中,避免每轮迭代都往返传输。
5. MPI + GPU
多节点多 GPU 模式:
text
节点 0:MPI Rank 0 → GPU 0
节点 0:MPI Rank 1 → GPU 1
节点 1:MPI Rank 2 → GPU 0
节点 1:MPI Rank 3 → GPU 1每个 Rank 负责一个子域,GPU 执行局部计算,MPI 交换边界数据。
需要处理:
- Rank 与 GPU 绑定
- GPU Direct 通信
- Host Staging
- 子域负载均衡
- GPU 显存容量
6. MarineFlow 类 CFD 架构
text
GUI/项目管理
→ 生成网格与求解配置
→ decomposePar 域分解
→ mpiexec 启动求解器
→ 各 Rank 求本地控制体
→ Halo Exchange
→ reconstructPar 或并行后处理适合优化的层次:
- 多工况并行
- MPI 域分解
- 节点内线程
- GPU 稀疏求解器
- 并行结果处理
7. SAM 类结构求解架构
text
前处理
→ 单元数据
→ 并行单元积分/组装
→ 稀疏矩阵
→ 直接法或迭代法
→ 应力恢复
→ HDF5/结果文件不同分析的硬件选择:
- 中小型静力:多核直接法
- 超大线性静力:迭代法 + AMG + MPI/GPU
- 多工况:分解复用 + 工况并行
- 显式动力:GPU 优势明显
- 非线性隐式:CPU 复杂逻辑 + 并行线性求解
- 模态:并行特征值和线性求解
8. 任务流水线
计算系统不应让昂贵设备等待:
text
CPU 读取下一批数据
GPU 计算当前批次
磁盘写出上一批结果需要:
- 异步 I/O
- 双缓冲
- 有界队列
- 背压
- 避免全局同步
9. 负载均衡
按单元数量均分不一定均衡:
- 空化区域计算更复杂
- 非线性材料单元迭代更多
- 接触区域工作量更大
- 不同单元类型成本不同
- 分区边界大小不同
应使用加权分区或运行时测量调整。
10. 通信与计算重叠
域分解计算可以:
text
发出边界数据的非阻塞通信
→ 计算不依赖远程数据的内部区域
→ 等待通信完成
→ 计算边界区域如果内部计算量太少,通信无法被隐藏。
11. 并行 I/O
大型 CFD 瞬态结果或结构动力结果可能产生 TB 级数据。
方法:
- 每 Rank 独立文件:写入快,后处理和文件管理复杂
- 集合文件/HDF5:管理方便,需要并行 I/O 设计
- 在线派生量:求解时直接计算平均值、力和频谱
- 检查点与可视化结果分离
12. 选择建议
| 模型规模/特征 | 建议 |
|---|---|
| 小模型 | 单机串行或少量线程 |
| 中型线性结构 | 多核直接法 |
| 大型 SPD 结构 | CG + AMG,多核/GPU |
| 大型 CFD | MPI 域分解 + AMG/Krylov |
| 多航速/工况 | 优先任务级并行 |
| 显式动力 | 多核/GPU |
| 内存装不下 | 分布式内存 MPI |
| 输出远大于计算 | 优先优化 I/O |
13. 并行规模停止增长的信号
- 每核单元数过少
- Halo 通信占比快速升高
- AllReduce 等待明显
- 内存带宽已饱和
- GPU Kernel 太小
- 粗网格阶段并行度不足
- 最慢 Rank 明显落后
- I/O 时间超过求解时间
下一篇:[[15-verification-and-validation]]