OpenFOAM并行计算
理论:分区并行求解的机制
概述
OpenFOAM的计算是核越多越快吗?
到一定程度会变快,超过之后几乎不再变快,有时反而变慢。OpenFOAM的并行计算是把网格分成多个子域(decomposePar),各核求解自己的子域,同时通过MPI与相邻子域交换边界网格的值。核数增加时每核负责的网格减少,但边界交换数据的比例增加,而且线性求解器的全局求和(内积等)这类需要等待所有核同步的处理时间并不会减少。因此每核网格数少到一定程度后,通信和等待时间就会超过计算时间。参考值为每核几万到十几万网格,但会因网络(InfiniBand还是普通以太网)和求解器(压力方程的解法)而有很大差别。
阿姆达尔定律与边界比例
S为加速比,f为不可并行处理的比例,N为核数,E为并行效率,n为每核网格数。边界比例是假设立方体子域六个面都与其他子域相邻的上限估计。
阿姆达尔1967年的指出
揭示并行化极限的阿姆达尔定律,源于IBM工程师Gene Amdahl在1967年学术会议上的论述:无论增加多少处理器,只要存在不能并行的部分,加速比就有上限。1988年Gustafson提出反论,认为问题规模越大可并行部分的比例越高,于是“问题越大越能用好更多核”的观点也流行起来。两者在CFD中都成立:网格越大,能高效使用的核越多。
算例
加速比采用串行占比2%的Amdahl模型,不是OpenFOAM实测基准。边界单元占比是近似上限尺度。最优核心数及费用应在实际环境测量,也应比较物理核与逻辑核。
例:400万网格的计算(假设不可并行比例2%)
| 核数 | 每核网格数 | 加速比(阿姆达尔) | 并行效率 | 边界网格比例(估计) |
|---|---|---|---|---|
| 8 | 500,000 | 7.0 | 88% | 8% |
| 32 | 125,000 | 19.8 | 62% | 12% |
| 128 | 31,250 | 36.2 | 28% | 19% |
| 512 | 7,812 | 45.6 | 9% | 30% |
即使不可并行比例只有2%,512核时效率也降到9%。实际还要加上通信时间,效率往往更低。兼顾速度与核时(费用),本例中32〜128核是现实的范围。
用64核计算比32核还慢。发生了什么?
有几点值得怀疑。首先,核是否跨越了多个节点(计算机)。如果32核在一台机器内、64核用了两台,节点间通信会使速度骤降,网络是普通以太网时影响尤其大。其次是分区平衡。即使用scotch分区、网格数相同,若各子域边界面数差别很大,所有核都要等最慢的那个。decomposePar的输出中有各子域的网格数和边界面数,应加以确认。第三是压力的线性求解器:GAMG(代数多重网格)在粗层上全局通信增加,核数多时要重新检查nCellsInCoarsestLevel等设置。最后还要确认是否把超线程的逻辑核也算进去了,超过物理核数运行不会变快。
实务流程
- 以每核几万到十几万网格为参考确定候选分区数。
- 在decomposeParDict中指定scotch分区,确认各子域的网格数和边界面数。
- 用短时间计算(几十步)改变分区数测量每步时间。
- 在效率不低于约50〜70%的范围内选最快的分区数。
- 用reconstructPar合并结果,或在ParaView中以分区状态打开。
“不合并直接后处理”
大规模计算中,用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是按方向指定分割数的方法,对简单形状效率高,但对复杂形状边界容易增多。每核网格数越少,边界面比例越大。
参考资料与检验范围
所列数值是基于文中假设的教学参考计算。资料用于理论和设置参考,不证明已在各软件中复现这些数值。工程决策须按实际条件验证。