4. 并行计算模型

电磁仿真(FDTD、FEM、MoM、BEM)在 HPC 上的性能,本质上取决于“计算任务如何被拆分、数据如何被搬运、同步如何被最小化”。并行计算模型就是回答这三个问题的抽象约定。本节把 MPI、OpenMP、CUDA、OpenCL 以及混合模型放在同一张“映射图”上理解:它们分别对应进程级、线程级、设备级并行,并在电磁仿真中承担不同的网格/矩阵/频点/角度分解职责。

一、核心原理:五种模型的分工与边界

MPI(进程级并行):每个 rank 是独立进程,拥有私有地址空间,通过消息传递交换边界场值或矩阵块。适合跨节点、跨 NUMA 的大规模分解,是电磁仿真“分布式内存”层的主力。其代价是通信与同步:FDTD 每步都要交换 Yee 网格边界层,FEM 则要处理稀疏矩阵向量乘的 halo 交换。

OpenMP(线程级并行):共享内存多线程,通过 #pragma omp parallel for 把循环迭代分配给线程。适合单节点内对网格单元、频点、激励源做并行,开销低、实现快,但受限于单机内存与 NUMA 亲和性。

CUDA(GPU 设备级并行):以线程块/网格组织,显式管理 global/shared/register 存储层次,适合规则网格上高算术强度的 stencil 更新(FDTD 的 E/H 场推进)和稠密/稀疏矩阵运算。其瓶颈常在 PCIe/NVLink 传输与 kernel 启动开销。

OpenCL(跨平台设备并行):与 CUDA 同属“设备并行”抽象,但可运行于 NVIDIA、AMD、Intel GPU 及 FPGA。适合需要异构兼容的电磁求解器,代价是平台差异带来的调优复杂度。

混合编程模型:MPI + OpenMP(节点间 + 节点内)、MPI + CUDA/OpenCL(节点间 + 设备内)、MPI + OpenMP + CUDA(三层)。电磁仿真中常见“MPI 按子域分解、OpenMP 按网格条带、CUDA 按 stencil 并行”的三级映射。

电磁仿真并行计算模型映射图 从物理分解 → 编程模型 → 硬件层级 → 典型电磁负载 物理分解对象 子域 / 网格块 FDTD Yee 网格 稀疏矩阵块 FEM / MoM 矩阵 频点 / 角度 扫频、RCS 扫描 激励源 / 端口 多端口 S 参数 时间步 / 迭代 场推进、Krylov 迭代 并行编程模型 MPI 进程级 · 消息传递 OpenMP 线程级 · 共享内存 CUDA 设备级 · NVIDIA GPU OpenCL 设备级 · 跨平台异构 混合模型 MPI + OpenMP + GPU 硬件层级 多节点集群 InfiniBand / RoCE 单节点多核 NUMA / L3 Cache GPU 设备 SM / 显存 / NVLink 加速器 / FPGA OpenCL 目标设备 存储与 I/O Lustre / 并行文件系统 典型电磁负载 FDTD 场推进 stencil 更新 FEM 稀疏求解 SpMV / Krylov MoM 矩阵填充 稠密/低秩压缩 扫频 / 参数扫描 embarrassingly parallel 后处理 / 可视化 场图、S 参数 映射原则:物理分解粒度 ≥ 编程模型粒度 ≥ 硬件并行粒度,避免“大炮打蚊子”或“小马拉大车”

二、方法流程:从物理问题到并行映射

把电磁仿真映射到并行模型,通常遵循四步流程:

  1. 识别并行维度:FDTD 优先按空间子域分解;FEM/MoM 优先按矩阵行块或频点分解;参数扫描天然按任务分解。
  2. 选择模型组合:跨节点用 MPI,节点内用 OpenMP,规则 stencil 用 CUDA/OpenCL,形成 MPI+X 混合。
  3. 设计通信模式:FDTD 用边界 halo 交换,FEM 用稀疏矩阵向量乘的 all-to-all 或邻居通信,MoM 用块循环分布。
  4. 调优与验证:用强/弱扩展性测试、通信占比、GPU 利用率、NUMA 亲和性来定位瓶颈。
典型混合启动命令(MPI + OpenMP + CUDA):
# 每节点 2 个 MPI rank,每 rank 8 个 OpenMP 线程,绑定到 2 块 GPU
export OMP_NUM_THREADS=8
export OMP_PLACES=cores
export OMP_PROC_BIND=close
mpirun -np 16 --map-by ppr:2:node \
  --bind-to core \
  ./em_fdtd_solver --grid 2048x2048x512 \
  --device 0,1 --halo-exchange cuda-aware-mpi

三、案例/场景:FDTD 与 FEM 的模型选择

场景 A:FDTD 天线阵列仿真。网格规则、计算密集、通信模式固定。推荐 MPI 按 X 方向切子域,OpenMP 并行 Y/Z 平面,GPU 加速 E/H 场更新。此时 MPI 负责 halo 交换,OpenMP 负责线程调度,CUDA 负责 stencil 内核。若单 GPU 显存不足,则用 CUDA-aware MPI 直接做 GPU 间通信,避免主机内存中转。

场景 B:FEM 微波器件仿真。矩阵稀疏、迭代求解、通信不规则。推荐 MPI 按图分区(METIS/ParMETIS)划分矩阵行,OpenMP 并行 SpMV 与预条件子,GPU 用于稠密块或低秩压缩。此时 OpenMP 的 NUMA 亲和性比 GPU 更关键,因为 SpMV 是内存带宽受限。

场景 C:MoM 大规模 RCS 扫描。矩阵填充与求解可分离,频点/角度天然独立。推荐 MPI 按频点/角度分发任务,每个任务内部用 OpenMP 或 GPU 加速矩阵填充,属于“任务并行 + 数据并行”的混合。

四、模型对比与选型清单

模型 并行层级 内存模型 典型电磁映射 主要瓶颈
MPI 进程 / 节点间 分布式 子域分解、矩阵行块、频点分发 通信延迟、halo 交换、负载不均
OpenMP 线程 / 节点内 共享内存 网格条带、SpMV、频点循环 NUMA 亲和、伪共享、线程开销
CUDA 线程块 / GPU 设备显存 FDTD stencil、稠密矩阵乘 PCIe 传输、kernel 启动、显存容量
OpenCL 工作组 / 异构设备 设备显存 跨平台 FDTD、FPGA 加速 平台差异、编译器优化不足
混合模型 进程 + 线程 + 设备 分布式 + 共享 + 设备 大规模 FDTD/FEM 多级分解 映射复杂度、调试困难、同步开销
选型口诀:跨节点看 MPI,节点内看 OpenMP,规则 stencil 看 CUDA/OpenCL,参数扫描看任务并行。先做弱扩展性测试,再决定是否引入 GPU;否则可能“通信没优化,GPU 空转”。

五、误区与复盘

  • 误区一:MPI rank 越多越快。当子域小于 halo 层厚度时,通信量超过计算量,扩展性反而下降。应保证每个 rank 的网格块至少包含 8~16 层 halo。
  • 误区二:OpenMP 线程数等于核数。若未设置 OMP_PROC_BIND,线程可能在 NUMA 节点间迁移,导致内存带宽下降。建议绑定到物理核并关闭超线程。
  • 误区三:GPU 一定比 CPU 快。对于小规模 FDTD 或稀疏度极高的 FEM,GPU 的传输与启动开销可能超过收益。应先用 roofline 模型估算算术强度。
  • 误区四:混合模型等于简单叠加。MPI+OpenMP+CUDA 需要统一的任务划分策略,否则会出现“MPI 等 OpenMP、OpenMP 等 GPU”的串行化。
复盘建议:每次调优后记录三组数据——计算时间、通信时间、GPU 利用率。若通信占比超过 30%,优先优化分解策略或改用 CUDA-aware MPI;若 GPU 利用率低于 60%,检查 kernel 是否被小网格或分支发散拖累。

综上,MPI、OpenMP、CUDA、OpenCL 并非互斥选项,而是电磁仿真并行化“工具箱”中的不同层级工具。理解物理分解与硬件层级的对应关系,才能把 FDTD、FEM、MoM 的计算负载准确映射到合适的并行模型上,并在扩展性、通信开销与开发成本之间取得平衡。