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