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 --version 和 ldd 里显示的 MPI 来源不一致,优先修正环境,而不是继续改输入文件。
编译记录里应保留 MPI 信息
对 LAMMPS、GROMACS、OpenFOAM、VASP 等软件,建议在编译记录里写明:
- 使用的 MPI 实现和版本。
mpicc/mpicxx/mpifort的绝对路径。- CMake 或 Makefile 中 MPI 相关变量。
- 运行时加载环境的脚本或 module 名称。
例如:
readlink -f "$(which mpicxx)"
mpicxx --version
mpicxx -show
Slurm 环境下还要考虑启动方式
在 Slurm 集群中,srun、mpirun、PMI、PMIx 的组合也会影响并行程序启动。不能简单把登录节点上能跑的 mpirun -np 4 直接复制到所有作业脚本。
至少要确认:
srun --mpi=list
scontrol show config | grep -i mpi
如果站点已有推荐模板,应优先使用站点模板,而不是自行混用不同 MPI 的启动方式。
一个简单原则
同一个软件从编译到运行,尽量只使用一套 MPI。确实需要多套 MPI 共存时,用 module、Spack、容器或清晰的环境脚本隔离,避免在全局 .bashrc 里永久叠加多个 MPI 路径。