MPI 不是只有 mpirun 一个命令

在科研软件环境里,“装了 MPI”通常不够明确。真正需要一致的是同一套 MPI 的编译器包装器、头文件、动态库和运行器。

常见混用方式包括:

  • 用 OpenMPI 的 mpicxx 编译,运行时 PATH 里先找到 MPICH 的 mpirun
  • 编译时链接 Intel MPI,运行时 LD_LIBRARY_PATH 指向系统 OpenMPI。
  • Conda 环境里带了一套 MPI,系统 module 又加载了另一套 MPI。

这些问题最后可能表现为 libmpi.so 找不到、作业卡住、进程数异常、PMI/PMIx 报错,或者更隐蔽的运行时崩溃。

先确认四个路径

which mpicc
which mpicxx
which mpirun
which mpiexec

mpicc -show 2>/dev/null || mpicc --showme 2>/dev/null
mpicxx -show 2>/dev/null || mpicxx --showme 2>/dev/null
mpirun --version

再看目标软件链接到了哪套库:

ldd /path/to/executable | grep -i mpi

如果 mpirun --versionldd 里显示的 MPI 来源不一致,优先修正环境,而不是继续改输入文件。

编译记录里应保留 MPI 信息

对 LAMMPS、GROMACS、OpenFOAM、VASP 等软件,建议在编译记录里写明:

  • 使用的 MPI 实现和版本。
  • mpicc/mpicxx/mpifort 的绝对路径。
  • CMake 或 Makefile 中 MPI 相关变量。
  • 运行时加载环境的脚本或 module 名称。

例如:

readlink -f "$(which mpicxx)"
mpicxx --version
mpicxx -show

Slurm 环境下还要考虑启动方式

在 Slurm 集群中,srunmpirun、PMI、PMIx 的组合也会影响并行程序启动。不能简单把登录节点上能跑的 mpirun -np 4 直接复制到所有作业脚本。

至少要确认:

srun --mpi=list
scontrol show config | grep -i mpi

如果站点已有推荐模板,应优先使用站点模板,而不是自行混用不同 MPI 的启动方式。

一个简单原则

同一个软件从编译到运行,尽量只使用一套 MPI。确实需要多套 MPI 共存时,用 module、Spack、容器或清晰的环境脚本隔离,避免在全局 .bashrc 里永久叠加多个 MPI 路径。