源码编译Numpy对接AMD BLIS后导入失败:未定义符号cblas_sgemm
Numpy源码编译对接BLIS(Zen3优化)+OpenBLAS时
cblas_sgemm未定义符号问题 问题场景与已执行步骤
我尝试从源码编译本地版本的Numpy,使其对接BLIS(提供BLAS和CBLAS,针对Zen3架构优化)以及OpenBLAS(提供LAPACK),但导入Numpy时触发未定义符号错误。已执行操作如下:
- 编译带CBLAS的Zen3优化BLIS:
测试全通过后执行./configure --enable-threading=openmp --enable-cblas --prefix=$HOME/blis zen3make install,确认$HOME/blis目录下存在相关库文件。 - 本地编译OpenBLAS,无特殊配置。
- 修改Numpy的
site.cfg配置路径:[blis] libraries = blis library_dirs = /home/or/blis/lib/ include_dirs = /home/or/blis/include/blis runtime_library_dirs = /home/or/blis/lib/ [openblas] libraries = openblas library_dirs = /opt/OpenBLAS/lib include_dirs = /opt/OpenBLAS/include runtime_library_dirs = /opt/OpenBLAS/lib - 编译安装Numpy(按文档要求将
NPY_CBLAS_LIBS设为空,因BLIS已包含CBLAS):NPY_BLAS_ORDER=blis NPY_LAPACK_ORDER=openblas NPY_CBLAS_LIBS= python ./numpy/setup.py build -j 32
错误信息
导入Numpy时报错:
Original error was: /home/or/.pyenv/versions/3.9.6/lib/python3.9/site-packages/numpy-1.24.0.dev0+998.g6a5086c9b-py3.9-linux-x86_64.egg/numpy/core/_multiarray_umath.cpython-39-x86_64-linux-gnu.so: undefined symbol: cblas_sgemm
通过pip安装的预编译Numpy(内置OpenBLAS)可正常导入。
后续排查更新
- 查看
make install日志发现,即便指定路径存在文件,系统仍无法定位BLIS库文件。 - 尝试重新编译BLIS并更换安装路径、重新配置Numpy后编译,问题依旧。
- 使用AMD官网预编译的BLIS时Numpy可正常工作,但缺少Zen3架构优化。
解决步骤
1. 确认BLIS库的CBLAS符号是否正确导出
用nm命令检查BLIS库中的CBLAS符号:
nm -D $HOME/blis/lib/libblis.so | grep cblas_sgemm
如果输出为空,说明BLIS编译时CBLAS未正确启用,需重新编译:
- 清理旧构建文件:
make clean - 重新配置(明确指定CBLAS实现为BLIS):
./configure --enable-threading=openmp --enable-cblas --enable-cblas-vendor=blis --prefix=$HOME/blis zen3 - 编译安装:
make -j32 && make install
2. 确保Numpy编译时正确链接BLIS
编译前临时将BLIS路径加入环境变量,避免链接阶段找不到库:
export LD_LIBRARY_PATH=$HOME/blis/lib:$LD_LIBRARY_PATH export LIBRARY_PATH=$HOME/blis/lib:$LIBRARY_PATH export C_INCLUDE_PATH=$HOME/blis/include/blis:$C_INCLUDE_PATH
重新编译Numpy并查看链接过程:
NPY_BLAS_ORDER=blis NPY_LAPACK_ORDER=openblas NPY_CBLAS_LIBS= python ./numpy/setup.py build -j 32 --verbose
检查输出中是否包含-L/home/or/blis/lib -lblis的链接参数。
3. 调整site.cfg配置细节
在[blis]段添加强制链接参数,确保运行时能找到库:
[blis] libraries = blis library_dirs = /home/or/blis/lib/ include_dirs = /home/or/blis/include/blis runtime_library_dirs = /home/or/blis/lib/ extra_link_args = -Wl,-rpath=/home/or/blis/lib -fopenmp
注:-fopenmp对应BLIS编译时启用的OpenMP线程模型,若用其他线程模型需替换对应参数。
4. 检查Numpy构建检测日志
查看Numpy编译生成的检测日志,确认BLIS被正确识别:
cat build/temp.linux-x86_64-3.9/numpy/core/blas_opt_info.txt
日志中应明确显示BLIS的路径、库文件及CBLAS符号检测结果。
内容的提问来源于stack exchange,提问作者Crispy Holiday
相关产品推荐
相关产品推荐

