典型现象

运行并行程序时报类似错误:

error while loading shared libraries: libmpi.so.40: cannot open shared object file: No such file or directory

或者:

libmpifort.so: cannot open shared object file

这类问题通常不是输入文件错误,而是可执行文件链接到的 MPI 动态库在当前运行环境中不可见。

先看程序实际链接了什么

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

如果输出里有 not found,说明动态链接器当前找不到对应库。继续检查:

which mpirun
mpirun --version
echo "$LD_LIBRARY_PATH"

不要只看 mpirun 在哪里,还要确认可执行文件链接的 libmpi.so 来自哪里。

常见原因

  1. 编译时使用的 MPI 没有在运行时加载。
  2. 登录 shell 里能找到 MPI,但 Slurm 作业脚本里没有加载。
  3. .bashrc、module、Conda 同时修改 PATH 和 LD_LIBRARY_PATH,顺序被覆盖。
  4. 编译和运行使用了不同 MPI 实现,例如 OpenMPI 与 MPICH 混用。

修复方向

如果使用 module,作业脚本里也要加载同一套环境:

module purge
module load gcc/xx openmpi/xx
ldd /path/to/executable | grep -i mpi

如果使用手写环境脚本,建议显式记录:

export MPI_HOME=/opt/openmpi/4.1.6
export PATH="$MPI_HOME/bin:$PATH"
export LD_LIBRARY_PATH="$MPI_HOME/lib:$LD_LIBRARY_PATH"

修完后重新检查:

which mpirun
mpirun --version
ldd /path/to/executable | grep -i mpi

验证

先用最小并行命令验证运行环境:

mpirun -np 2 hostname

再运行目标软件的小算例。不要直接用大型生产作业验证,否则 MPI 环境问题会和输入、资源、性能问题混在一起。