Apptainer构建LIS迭代求解器库问题:四倍精度未启用
解决LIS库容器构建中四倍精度(Quad Precision)未启用的问题
问题诊断
报错lis_solver.c(527) : lis_solve_kernel : error ILL_ARG :Quad precision is not enabled说明:即使你在configure中指定了--enable-quad参数,LIS库编译时仍未正确启用四倍精度支持。核心原因可能是编译器环境未正确配置、configure未检测到编译器的四倍精度能力,或测试环节环境变量缺失。
解决方案
1. 确保Intel MPI环境正确加载并使用对应编译器
Intel OneAPI的setvars.sh会配置环境变量,将Intel编译器(icc/ifort)设为默认,这类编译器对四倍精度的支持更完善。修改构建脚本,确保编译LIS前正确加载环境:
source /tmp/intel/oneapi/setvars.sh > /dev/null 2>&1 # 验证编译器是否为Intel版本 echo "Current Fortran compiler: $FC" echo "Current C compiler: $CC"
如果输出不是ifort和icc,说明环境加载失败,需检查绑定的/opt/intel路径是否包含完整的OneAPI安装包。
2. 调整configure参数,明确启用四倍精度编译
根据使用的编译器添加对应参数:
- Intel编译器:添加
-qquad编译参数强制启用四倍精度 - GCC编译器:添加
-lquadmath到LDFLAGS,确保链接四倍精度数学库
修改后的configure命令:
./configure --prefix=/usr/local --enable-f90 --enable-mpi --enable-shared --enable-saamg --enable-quad --enable-sse2 --enable-fma \ 'CFLAGS=-O3 -march=x86-64 -mtune=generic -frounding-math -fsignaling-nans -qquad' \ 'FCFLAGS=-O3 -march=x86-64 -mtune=generic -frounding-math -fsignaling-nans -qquad' \ 'LDFLAGS=-lquadmath'
3. 验证configure检测结果
在configure执行后添加日志检查,确认四倍精度已被成功启用:
grep "Quad precision" config.log
若输出为Quad precision: yes,说明检测成功;若为no,则需检查编译器版本是否支持或依赖库是否缺失。
4. 确保测试环节环境变量正确
make check时需要加载LIS库和Intel MPI的路径,避免动态链接错误:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:$INTEL_MPI_DIR/lib make check
修改后的完整构建脚本
Bootstrap: docker From: ubuntu:22.04 %environment export INTEL_MPI_DIR="/tmp/intel" export INCLUDE_DIR="$INTEL_MPI_DIR/include" export LIB_DIR="$INTEL_MPI_DIR/lib" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib:$LIB_DIR" %post -c /bin/bash export DEBIAN_FRONTEND=noninteractive export TZ=Etc/UTC # Install necessary dependencies apt update && apt upgrade -y apt install -y build-essential wget gfortran cmake unzip gcc g++ libgcc-10-dev libx11-dev libxext-dev libxft-dev libxmu-dev libboost-all-dev libquadmath0 # Load Intel OneAPI environment source /tmp/intel/oneapi/setvars.sh > /dev/null 2>&1 echo "FC: $FC" echo "CC: $CC" # Download and build LIS wget https://www.ssisc.org/lis/dl/lis-2.1.7.zip -O /tmp/lis-2.1.7.zip unzip /tmp/lis-2.1.7.zip -d /tmp/ cd /tmp/lis-2.1.7 ./configure --prefix=/usr/local --enable-f90 --enable-mpi --enable-shared --enable-saamg --enable-quad --enable-sse2 --enable-fma \ 'CFLAGS=-O3 -march=x86-64 -mtune=generic -frounding-math -fsignaling-nans -qquad' \ 'FCFLAGS=-O3 -march=x86-64 -mtune=generic -frounding-math -fsignaling-nans -qquad' \ 'LDFLAGS=-lquadmath' # Verify Quad precision detection grep "Quad precision" config.log make -j$(nproc) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:$INTEL_MPI_DIR/lib make check make install
额外排查步骤
- 若使用GCC编译器,确保
gfortran版本在4.6及以上(支持__float128类型) - 查看
config.log中关于四倍精度的检测细节,定位具体失败原因 - 尝试单独编译四倍精度测试用例,验证库功能是否正常
内容的提问来源于stack exchange,提问作者Hamish Robertson
相关产品推荐
相关产品推荐

