集群更换OS与模块系统后PETSC出现符号查找错误求助
PETSc 3.19 迁移至 Rocky Linux 8 + Lmod 后符号查找错误排查
集群从CentOS 7切换到Rocky Linux 8,模块系统更换为Lmod后,运行基于PETSc 3.19的应用时出现大量undefined symbol错误:
- 使用
make启动程序无响应,需手动终止 - 通过
LD_DEBUG=files调试时,出现UCX相关符号错误:/cvmfs/software.hpc.rwth.de/Linux/RH8/x86_64/intel/skylake_avx512/software/UCX/1.12.1-GCCcore-11.3.0/lib/ucx/libuct_cma.so.0: error: symbol lookup error: undefined symbol: ucs_module_global_init (fatal) - 同时伴随PETSc库的符号缺失错误:
/rwthfs/rz/cluster/home/mh787286/petsc/arch-linux-c-debug/lib/libpetsc.so.3.19: error: symbol lookup error: undefined symbol: MPID_Abort (fatal) /rwthfs/rz/cluster/home/mh787286/petsc/arch-linux-c-debug/lib/libpetsc.so.3.19: error: symbol lookup error: undefined symbol: ps_tool_initialize (fatal)
已确认PETSc依赖的共享库均在LD_LIBRARY_PATH中,使用的自定义Makefile内容如下:
### VARIABLES ifndef PETSC_DIR PETSC_DIR=petsc/arch-linux-c-debug ifdef R_SLURM_ROLES module load GCC/11.3.0 OpenMPI/4.1.4 endif UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Darwin) PETSC_DIR=/usr/local/Cellar/petsc/3.18.5 endif endif include $(PETSC_DIR)/lib/petsc/conf/petscvariables CFLAGS=-Werror -ggdb -Wall -D_GNU_SOURCE -Wno-nullability-completeness INCLUDES=$(PETSC_CC_INCLUDES) LDFLAGS=-L$(LD_LIBRARY_PATH) -L$(PETSC_DIR)/lib -lm $(PETSC_LIB_BASIC) ifeq ($(UNAME_S),Darwin) LDFLAGS=-L$(PETSC_DIR)/lib -lm $(PETSC_LIB_BASIC) endif GMSH = gmsh export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):$(PETSC_DIR)/arch-linux-c-debug/lib ### RUNTIME OPTIONS MPIOPTS=-np 1 # currently no parallel support SRC := $(wildcard src/*.cpp) $(wildcard src/**/*.cpp) OBJ := $(SRC:%.cpp=obj/%.o) # Meshes GEO := $(wildcard meshdata/*-1D.geo) MSH := $(GEO:%.geo=%.msh) # Systems SYS := $(wildcard sysdata/*.sys) DEF := $(SYS:%.sys=%.def) # PetSc Options TOL=-snes_atol 1e-8 -snes_rtol 1e-30 -snes_stol 1e-16 -ts_pseudo_fatol 1e-8 -ts_pseudo_frtol 1e-30 MONITOR=-snes_converged_reason #-snes_monitor OPTS=$(MONITOR) $(TOL) -snes_max_it 10 # -info .PHONY: clean all debug valgrind test sys all: memristor sys run: sys memristor @rm -rf outdata/memristor2 @mv outdata/memristor outdata/memristor2 || true # cache last result @echo "[EX] >>> "$< $(LDPATH) $(MPIEXEC) -n 1 ./memristor $(OPTS) run-parallel: sys memristor $(LDPATH) $(MPIEXEC) -n 2 ./memristor $(OPTS) ### PATTERNS obj/%.o: %.cpp @echo "[CC] >>> "$< @mkdir -p $(dir $@) @$(CXX) $(CFLAGS) $(INCLUDES) -std=c++11 -c $< -o $@ %1D.msh: %1D.geo @echo "[GM] >>> "$< $(GMSH) -1 -format msh22 $< -o $@ ### Gmsh -1 -format msh22 input.geo -o output.msh %.def: %.sys @echo "[DG] >>> "$< @sysdata/defgen3.py $< > $@ ### MESHES geo: $(MSH) ### SYSTEMS sys: $(DEF) ### APPLICATIONS bpm: $(OBJ) obj/bpm.o @echo "[LD] >>> "$@ $(CXX) $(OBJ) obj/bpm.o -o $@ $(LDFLAGS) bpm-run: sys bpm @echo "[EX] >>> "$< $(LDPATH) $(MPIEXEC) -n 1 ./bpm $(POTENTIAL) $(OPTS) cathode: $(OBJ) obj/cathode.o @echo "[LD] >>> "$@ $(CXX) $(OBJ) obj/cathode.o -o $@ $(LDFLAGS) cathode-run: sys cathode @echo "[EX] >>> "$< $(LDPATH) $(MPIEXEC) -n 1 ./cathode $(OPTS) valgrind-cathode: cathode @echo "[VG] >>> "$< @$(LDPATH) valgrind --leak-check=full --track-origins=yes --show-leak-kinds=all --log-file=valgrind-out.txt ./cathode callgrind-cathode: cathode @echo "[VG] >>> "$< @$(LDPATH) valgrind --tool=callgrind ./cathode # --track-origins=yes clean: rm -rf obj/*
排查建议
- 重新编译PETSc适配新环境:原PETSc是在CentOS7下编译的,Rocky Linux8的glibc、编译器版本存在差异,二进制兼容性差。需在新环境重新编译:
- 加载Makefile中指定的
GCC/11.3.0 OpenMPI/4.1.4模块 - 按照PETSc官方步骤配置编译,确保链接当前环境的MPI库,可添加
--with-mpi=yes等参数
- 加载Makefile中指定的
- 验证UCX与MPI的兼容性:UCX是OpenMPI的依赖组件,符号缺失可能源于版本不匹配或加载顺序错误:
- 调整模块加载顺序,先加载UCX再加载OpenMPI,或直接使用集群配套的MPI+UCX模块
- 用
ldd /rwthfs/rz/cluster/home/mh787286/petsc/arch-linux-c-debug/lib/libpetsc.so.3.19查看PETSc链接的MPI、UCX库路径,确认是否与当前环境一致
- 修正Makefile的LD_LIBRARY_PATH配置:当前硬编码路径可能导致冲突,建议:
- 清空LD_LIBRARY_PATH后再加载模块,最后添加PETSc库路径
- 优先使用集群提供的PETSc模块,避免手动指定路径
- 定位符号缺失来源:
MPID_Abort属于MPI库符号,说明PETSc编译时链接的MPI与运行时加载的版本不匹配,重新编译时需绑定当前环境的MPIps_tool_initialize来自libpsm2库(PMI2组件),检查是否加载对应模块,或编译PETSc时是否开启PMI支持
- 添加链接调试选项:在Makefile的LDFLAGS中加入
-Wl,--verbose,查看链接过程中实际使用的库路径和版本,确认是否存在不匹配情况
内容的提问来源于stack exchange,提问作者Mahe
相关产品推荐
相关产品推荐

