4. 并行环境搭建与配置

并行计算能否真正跑起来,取决于三件事是否同时成立:集群节点之间能互通、MPI 通信库与 Fluent 版本匹配、启动参数与硬件拓扑一致。任何一环错位,都会表现为启动失败、节点掉线或并行加速比远低于预期。本节按“环境准备 → MPI 选择与调优 → 启动参数”的顺序展开,并在最后给出一份可直接对照使用的启动参数速查表。

一、Linux 集群环境准备

Fluent 并行运行依赖三个基础条件:无密码 SSH 互信、共享文件系统、一致的系统环境。这三项不满足时,Fluent 往往在 mpiexec 阶段就报错退出。

1. 主机名与 hosts 解析。集群每个节点应有固定主机名,并在所有节点的 /etc/hosts 中保持一致映射。若使用 DNS,需确保正向与反向解析都能返回正确主机名,否则 MPI 在建立连接时会因主机名不匹配而失败。示例:

# /etc/hosts(所有节点保持一致)
192.168.10.11  node01
192.168.10.12  node02
192.168.10.13  node03
192.168.10.14  node04

2. SSH 无密码互信。并行启动时,主节点需要免密登录到所有计算节点。做法是在主节点生成密钥并分发公钥:

ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
ssh-copy-id node01
ssh-copy-id node02
# 验证:应无需输入密码即可登录
ssh node02 hostname

验证时不要只测主节点到计算节点,还要测计算节点之间,因为部分 MPI 实现会建立节点间直连。

3. 共享文件系统。Fluent 的 case、data、transcript 以及并行分区文件需要被所有节点访问。常用方案是 NFS 或 Lustre。NFS 挂载示例:

# 服务端 /etc/exports
/data/fluent 192.168.10.0/24(rw,sync,no_subtree_check)
# 客户端挂载
mount -t nfs node01:/data/fluent /data/fluent

需要特别注意的是,工作目录必须位于共享存储上,而不是各节点本地磁盘。若把 case 放在本地 /tmp,从节点读不到文件,会直接报“cannot open case file”。

4. 环境一致性。所有节点的 Fluent 安装路径、环境变量、glibc 版本、MPI 库版本应一致。建议在 ~/.bashrc 中统一设置:

export FLUENT_INC=/opt/ansys/fluent
export PATH=$FLUENT_INC/bin:$PATH
export LD_LIBRARY_PATH=$FLUENT_INC/lib:$LD_LIBRARY_PATH

此外,建议关闭或放宽防火墙对 MPI 通信端口的限制,并确认节点间网络延迟与带宽满足要求——千兆网络适合小规模验证,真正的大规模并行应使用 InfiniBand 或 10GbE 以上互联。

二、MPI 实现选择与调优

Fluent 支持多种 MPI 实现,常见的有 Intel MPI、Open MPI、Platform MPI 和 MS-MPI(Windows)。在 Linux 集群上,主流选择是 Intel MPI 与 Open MPI。选择依据不是“哪个更新”,而是“哪个与当前 Fluent 版本、互联网络和调度器匹配”。

Intel MPI 通常与 Intel 编译器、InfiniBand 配合较好,在 Intel 平台上通信效率稳定;Open MPI 开源、跨平台、与 Slurm/PBS 集成成熟,适合异构集群。若集群使用 InfiniBand,应确认 MPI 是否启用了相应的 RDMA 传输层(如 ofa 或 psm2),否则会退化为 TCP,性能大幅下降。

调优时重点关注以下参数:

  • 进程绑定(binding):将 MPI 进程绑定到固定核心,避免操作系统在核心间迁移进程导致缓存失效。Intel MPI 可用 I_MPI_PIN=1,Open MPI 可用 --bind-to core。
  • 网络传输层:InfiniBand 环境下显式指定 I_MPI_FABRICS=shm:ofa,避免误走 TCP。
  • 共享内存通信:同一节点内的进程间通信应走共享内存,跨节点才走网络,这是默认行为,但需确认未被错误配置覆盖。
  • 进程数与核心数匹配:通常每个物理核心一个 MPI 进程;若开启超线程,需评估是否真的带来收益,很多 CFD 场景下超线程反而降低效率。

下面这张图展示了从集群环境到 Fluent 并行启动的完整信号与依赖链,以及各环节的关键检查点:

Fluent 并行启动依赖链与关键检查点 ① 集群基础环境 主机名 + /etc/hosts 正反向解析一致 SSH 无密码互信 主↔从、从↔从 共享文件系统 NFS / Lustre 挂载 环境变量一致 FLUENT_INC / LD_LIBRARY_PATH ② MPI 实现选择与调优 Intel MPI I_MPI_PIN=1 I_MPI_FABRICS=shm:ofa Open MPI --bind-to core --mca btl_openib_allow_ib 1 进程绑定 每物理核心 1 进程 避免核心迁移 网络传输层 IB 走 RDMA 避免退化为 TCP ③ Fluent 并行启动参数 -t 进程数 总 MPI 进程数 例:-t 64 -pib / -pintel / -pmpi 指定 MPI 实现 例:-pib(InfiniBand) -ssh / -cnf=hostfile 指定节点列表与启动方式 例:-cnf=hosts.txt -ssh 并行启动成功 → 检查加速比与负载均衡

三、Fluent 并行启动参数详解

Fluent 的并行启动命令通常形如:

fluent 3ddp -t64 -pib -cnf=hosts.txt -ssh -g -i run.jou

各参数含义如下:

参数作用典型取值与说明
-t 指定总 MPI 进程数 如 -t64 表示 64 个进程;应等于或略小于可用物理核心总数
-p 指定 MPI 实现 -pib(InfiniBand)、-pintel(Intel MPI)、-pmpi(Platform MPI)、-popenmpi(Open MPI)
-cnf 指定节点主机文件 文件中每行一个主机名,可带 :n 指定该节点进程数,如 node01:16
-ssh 使用 SSH 方式远程启动 Linux 集群常用;需已配置无密码互信
-g 无图形界面启动 集群计算节点通常无 X11,必须加此参数
-i 指定 journal 文件 如 -i run.jou,用于批量执行 TUI 命令

主机文件 hosts.txt 示例:

node01:16
node02:16
node03:16
node04:16

这表示在 4 个节点上各启动 16 个进程,共 64 个进程。若节点核心数不同,应按实际核心数分配,避免某节点过载。

提示:启动后应检查 Fluent 控制台输出的进程分布信息,确认每个节点实际启动的进程数与预期一致。若某节点进程数为 0,通常是 SSH 互信或主机名解析问题。

四、启动参数速查与验证

下面给出一份可直接对照使用的启动参数速查表,覆盖常见场景:

场景推荐命令片段说明
单节点多核验证 fluent 3ddp -t8 -g -i run.jou 不指定 -cnf,默认本机启动
多节点 InfiniBand fluent 3ddp -t64 -pib -cnf=hosts.txt -ssh -g 需确认 IB 驱动与 MPI 匹配
多节点 Intel MPI fluent 3ddp -t64 -pintel -cnf=hosts.txt -ssh -g 适合 Intel 平台 + Slurm 调度
Open MPI 环境 fluent 3ddp -t64 -popenmpi -cnf=hosts.txt -ssh -g 需确认 Open MPI 版本与 Fluent 兼容

启动成功后,不要只看“是否跑起来”,还要看“跑得是否高效”。建议在 Fluent 中监控以下指标:

  • 并行加速比:用单进程计算时间除以 N 进程计算时间,若加速比远低于 N 的线性增长,说明通信开销或负载不均。
  • 各进程计算时间:Fluent 会输出每个进程的 wall clock time,若某进程明显偏慢,说明分区不均或该节点资源被占用。
  • 通信时间占比:若通信时间占比超过 20%,应检查 MPI 传输层是否走 RDMA、进程绑定是否正确。
注意:并行进程数并非越多越好。当进程数超过网格分区可有效利用的规模时,通信开销会抵消计算收益,加速比甚至可能下降。建议从 8、16、32、64 逐级测试,找到当前模型与硬件下的最优进程数。

最后,建议把上述环境检查、MPI 选择、启动参数固化为一个启动脚本,并在脚本中加入节点连通性预检和日志记录。这样每次提交大规模计算前,都能快速确认环境是否就绪,避免因环境问题浪费机时。