典型现象
运行并行程序时报类似错误:
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 来自哪里。
常见原因
- 编译时使用的 MPI 没有在运行时加载。
- 登录 shell 里能找到 MPI,但 Slurm 作业脚本里没有加载。
.bashrc、module、Conda 同时修改 PATH 和 LD_LIBRARY_PATH,顺序被覆盖。- 编译和运行使用了不同 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 环境问题会和输入、资源、性能问题混在一起。