本文摘要(由AI生成):
本文主要介绍了Fluent UDF并行代码设计的相关知识。Fluent并行计算通过将计算区域分割成多个分区,并将每个数据分区分配给不同的处理器(称为计算节点)进行计算。并行计算涉及到计算区域的分割、内存数据的共享与交互,其过程要比串行计算复杂得多。对于UDF程序来说,若设计不当,并行计算会严重影响整体计算效率,可能会出现CPU越多,计算越慢的现象。因此,理解并行处理模式是编写并行UDF的关键。
本文简单介绍Fluent UDF并行代码设计。
注:本文内容翻译自Fluent UDF手册。
新版本的Fluent已经不再支持串行运行,哪怕指定其以1个CPU运行,Fluent启动的依然是并行模式。对于常规计算来讲并没有多大影响,然而对一些UDF的编译却会产生影响。
与单CPU运行的串行计算不同,并行计算中涉及到计算区域的分割、内存数据的共享与交互,其过程要比串行计算复杂得多。对于UDF程序来说,若设计不当,并行计算会严重影响整体计算效率,可能会出现CPU越多,计算越慢的现象。
Fluent并行求解程序通过同时使用多个处理器来计算一个大问题,这些处理器可以在同一台机器上,也可以是存在于网络中的不同机器上。通过将计算域分割成多个分区,并将每个数据分区分配给不同的处理器(称为计算节点)进行计算。
图1 计算区域分区
每个计算节点在自己的计算区域执行与其他计算节点相同的程序,计算完毕后对重叠区域的数据进行插值。
图2 分区网格边界
并行计算中包含一个主节点(Host节点),主节点不包含网格单元、面或节点(除非使用DPM共享内存模型),它的主要目的是解释来自于Cortex(负责用户界面和图形相关功能的ANSYS Fluent过程)的命令,然后将这些命令(和数据)传递给一个计算节点(称之为node0),该计算节点将这些命令(和数据)分发给其他计算节点(node1、node2…),整个流程如下图所示。Host节点相当于包工头,node0节点相当于小队长,其不仅要传递命令,还同时执行计算,至于往下的各计算节点,那就纯粹是临时工了,别管那么多,干活儿就对了。
注:理解并行处理模式是编写并行UDF的关键。
图3 并行计算命令传递流程
计算节点在其网格上存储数据并执行计算,而沿着分区边界的单层重叠网格单元提供了跨分区边界的数据通信和连续性。即使对网格单元和网格面进行了分区,网格中的所有Domain和thread也都镜像到每个计算节点上。Thread与串行解算程序中一样以链表的形式存储。计算节点可以在使用相同或不同操作系统的大规模并行计算机、多CPU工作站或工作站网络上实现。
图4 分布式网格中的域和Thread镜像
ANSYS Fluent会话中涉及的过程由Cortex、一个Host节点和一组n个计算节点(称为计算节点)定义,计算节点标记为0到n-1,如图5所示。主机接收来自Cortex的命令,并将命令传递给计算node-0。然后,node-0节点向所有其他计算节点发送命令。所有计算节点(0除外)都从node-0节点接收命令。在计算节点(通过compute node-0)将消息传递到Host之前,它们彼此之间进行数据同步。
图5 Fluent并行架构
每个计算节点实质上相互连接,并依赖其“通信器”执行诸如发送和接收数据、同步、执行全局约简(如对所有计算单元求和)和建立机器连接等功能。ANSYS Fluent通信器是一个消息传递库,比如它可以是消息传递接口(Message Passing Interface,MPI)标准的程序。
所有ANSYS Fluent节点(包括Host节点)都由唯一的整数ID标识。Host节点被分配ID为999999。Host从node-0收集消息,并对所有数据执行操作(例如打印、显示消息和写入文件)。
注意:所有对外操作都必须在Host节点上完成。这在后面的UDF程序编写时要格外注意。