OpenFOAM并行计算

分类:开源CAE | 2026-10-02 改写
CAE visualization for openfoam parallel theory - technical simulation diagram
OpenFOAM并行计算

理论:分区并行求解的机制

概述

🙋

OpenFOAM的计算是核越多越快吗?

🎓

到一定程度会变快,超过之后几乎不再变快,有时反而变慢。OpenFOAM的并行计算是把网格分成多个子域(decomposePar),各核求解自己的子域,同时通过MPI与相邻子域交换边界网格的值。核数增加时每核负责的网格减少,但边界交换数据的比例增加,而且线性求解器的全局求和(内积等)这类需要等待所有核同步的处理时间并不会减少。因此每核网格数少到一定程度后,通信和等待时间就会超过计算时间。参考值为每核几万到十几万网格,但会因网络(InfiniBand还是普通以太网)和求解器(压力方程的解法)而有很大差别。

阿姆达尔定律与边界比例

$$ S(N) = \frac{1}{f + \frac{1-f}{N}},\qquad E = \frac{S}{N},\qquad \frac{\text{boundary cells}}{\text{cells}} \approx \frac{6}{n^{1/3}} $$

S为加速比,f为不可并行处理的比例,N为核数,E为并行效率,n为每核网格数。边界比例是假设立方体子域六个面都与其他子域相邻的上限估计。

Coffee Break 随笔闲谈

阿姆达尔1967年的指出

揭示并行化极限的阿姆达尔定律,源于IBM工程师Gene Amdahl在1967年学术会议上的论述:无论增加多少处理器,只要存在不能并行的部分,加速比就有上限。1988年Gustafson提出反论,认为问题规模越大可并行部分的比例越高,于是“问题越大越能用好更多核”的观点也流行起来。两者在CFD中都成立:网格越大,能高效使用的核越多。

算例

加速比采用串行占比2%的Amdahl模型,不是OpenFOAM实测基准。边界单元占比是近似上限尺度。最优核心数及费用应在实际环境测量,也应比较物理核与逻辑核。

例:400万网格的计算(假设不可并行比例2%)

核数每核网格数加速比(阿姆达尔)并行效率边界网格比例(估计)
8500,0007.088%8%
32125,00019.862%12%
12831,25036.228%19%
5127,81245.69%30%

即使不可并行比例只有2%,512核时效率也降到9%。实际还要加上通信时间,效率往往更低。兼顾速度与核时(费用),本例中32〜128核是现实的范围。

🙋

用64核计算比32核还慢。发生了什么?

🎓

有几点值得怀疑。首先,核是否跨越了多个节点(计算机)。如果32核在一台机器内、64核用了两台,节点间通信会使速度骤降,网络是普通以太网时影响尤其大。其次是分区平衡。即使用scotch分区、网格数相同,若各子域边界面数差别很大,所有核都要等最慢的那个。decomposePar的输出中有各子域的网格数和边界面数,应加以确认。第三是压力的线性求解器:GAMG(代数多重网格)在粗层上全局通信增加,核数多时要重新检查nCellsInCoarsestLevel等设置。最后还要确认是否把超线程的逻辑核也算进去了,超过物理核数运行不会变快。

实务流程

  1. 以每核几万到十几万网格为参考确定候选分区数。
  2. 在decomposeParDict中指定scotch分区,确认各子域的网格数和边界面数。
  3. 用短时间计算(几十步)改变分区数测量每步时间。
  4. 在效率不低于约50〜70%的范围内选最快的分区数。
  5. 用reconstructPar合并结果,或在ParaView中以分区状态打开。
Coffee Break 随笔闲谈

“不合并直接后处理”

大规模计算中,用reconstructPar合并所有时刻会消耗大量时间和磁盘。用-time只合并需要的时刻,或在ParaView中以“Decomposed Case”打开,就不需要合并。若用函数对象在计算中输出力和平均值,很多时候根本不必合并场数据。并行计算中,事先决定包括后处理在内“哪些数据在哪里生成”,效率会更高。

常见错误

错误与对策

错误后果对策
核数过多通信使速度变慢通过实测确定分区数
跨节点速度骤降先确认节点内效率
分区不均衡所有核等待最慢者用scotch并检查边界面数
按逻辑核计数不会变快按物理核数
合并所有时刻浪费时间和磁盘只合并需要时刻或分区显示
🙋

我想了解相关内容。

常见问题

在OpenFOAM中如何进行并行计算?

在system/decomposeParDict中指定分区数(numberOfSubdomains)和分区方法(如scotch),运行decomposePar,然后用mpirun -np N 求解器名 -parallel计算。结果分别保存在processor0、processor1……文件夹中,可用reconstructPar合并,或在ParaView中以分区状态直接打开。

应该分成多少核?

每核几万到十几万网格为参考。400万网格的例子中,若不可并行部分占2%,32核(每核12.5万网格)加速19.8倍,128核(3.1万网格)约36倍,512核(7,800网格)只有45.6倍,效率降到9%。实际速度随网络和求解器而变,从较少的分区数开始依次实测最可靠。

分区方法选哪个?

通常scotch比较稳妥,它在均衡网格数的同时自动使子域边界面数(通信量)尽量少。simple和hierarchical是按方向指定分割数的方法,对简单形状效率高,但对复杂形状边界容易增多。每核网格数越少,边界面比例越大。

参考资料与检验范围

所列数值是基于文中假设的教学参考计算。资料用于理论和设置参考,不证明已在各软件中复现这些数值。工程决策须按实际条件验证。

关联模拟器

在本领域的交互式模拟器中体验理论

模拟器列表

相关分析领域

结构分析流体分析(CFD)热分析
本文评价
感谢您的反馈!
有帮助
更详细
报错
有帮助
0
更详细
0
报错
0