OpenMP:有限元矩阵并行组装中如何保护数组避免竞争条件?
并行加速有限元偏度与质量矩阵组装
我跟进了问题36182486、41421437及其他相关问题,目标是通过多处理器并行处理单个单元,来加速有限元(FEM)计算中偏度矩阵与质量矩阵的组装。下面是核心操作的最小工作示例(MWE),不过目前代码是截断状态:
编译命令
gfortran -fopenmp -o FEMassembly FEMassembly.f90
核心Fortran代码
Program FEMassembly use, intrinsic :: iso_c_binding implicit none real (c_double) :: arrayM(3,3)=reshape((/2.d0,1.d0,1.d0,1.d0,& &2.d0,1.d0,1.d0,1.d... ! 剩余矩阵组装的核心逻辑尚未完整给出 end Program FEMassembly
针对这类场景的并行优化小建议
- 要是想给单元循环做并行,直接用OpenMP的
!$OMP PARALLEL DO指令就行,但一定要注意竞争条件——多个线程不能同时写全局矩阵的同一个位置。要么用!$OMP ATOMIC或者!$OMP CRITICAL加锁保护,要么先让每个线程组装自己的局部子矩阵,最后再合并到全局矩阵,这样能减少锁的开销,效率更高。 - 如果单个单元的计算量足够大,也可以拆分单元内的矩阵操作做并行,但得先掂量掂量线程的开销,只有单个单元计算耗时真的比较久的时候,这么做才划算。
- 尽量让线程负载均衡,比如用
schedule(dynamic)动态调度任务,避免有的线程忙死、有的闲死的情况。
内容的提问来源于stack exchange,提问作者Clinton Winant
相关产品推荐
相关产品推荐

