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

源码编译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 zen3
    
    测试全通过后执行make 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:10:30