You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集群更换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、编译器版本存在差异,二进制兼容性差。需在新环境重新编译:
    1. 加载Makefile中指定的GCC/11.3.0 OpenMPI/4.1.4模块
    2. 按照PETSc官方步骤配置编译,确保链接当前环境的MPI库,可添加--with-mpi=yes等参数
  • 验证UCX与MPI的兼容性:UCX是OpenMPI的依赖组件,符号缺失可能源于版本不匹配或加载顺序错误:
    1. 调整模块加载顺序,先加载UCX再加载OpenMPI,或直接使用集群配套的MPI+UCX模块
    2. 用ldd /rwthfs/rz/cluster/home/mh787286/petsc/arch-linux-c-debug/lib/libpetsc.so.3.19查看PETSc链接的MPI、UCX库路径,确认是否与当前环境一致
  • 修正Makefile的LD_LIBRARY_PATH配置:当前硬编码路径可能导致冲突,建议:
    1. 清空LD_LIBRARY_PATH后再加载模块,最后添加PETSc库路径
    2. 优先使用集群提供的PETSc模块,避免手动指定路径
  • 定位符号缺失来源:
    • MPID_Abort属于MPI库符号,说明PETSc编译时链接的MPI与运行时加载的版本不匹配,重新编译时需绑定当前环境的MPI
    • ps_tool_initialize来自libpsm2库(PMI2组件),检查是否加载对应模块,或编译PETSc时是否开启PMI支持
  • 添加链接调试选项:在Makefile的LDFLAGS中加入-Wl,--verbose,查看链接过程中实际使用的库路径和版本,确认是否存在不匹配情况

内容的提问来源于stack exchange,提问作者Mahe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:14:54