首页 > 解决方案 > 如果与多个实现链接,numpy 使用哪个 blas 实现

问题描述

我想知道(最好选择)哪个 blas 实现由numpy. 在我的系统上openblas,我已经blis安装了整个系统。对于 numpy,我创建了一个新的虚拟环境并从源代码编译 numpy。然后我按照answernumpy.show_config()中的建议打开 python,导入 numpy 并运行。

blas_mkl_info:
  NOT AVAILABLE
blis_info:
    libraries = ['blis', 'blis']
    library_dirs = ['/usr/lib64']
    define_macros = [('HAVE_CBLAS', None)]
    include_dirs = ['/usr/local/include', '/usr/include', '/home/wichmann/pythontests/blis_numpy/include']
    language = c
blas_opt_info:
    libraries = ['blis', 'blis']
    library_dirs = ['/usr/lib64']
    define_macros = [('HAVE_CBLAS', None)]
    include_dirs = ['/usr/local/include', '/usr/include', '/home/wichmann/pythontests/blis_numpy/include']
    language = c
lapack_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/lib64']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/lib64']
    language = c
    define_macros = [('HAVE_CBLAS', None)]

但是,这仅显示 numpy 链接了哪些 blas 实现,而不是在运行时使用了哪些。我也挖得更深一点,用过ldd,无济于事。在我的虚拟环境中,blis_numpy/lib/python3.8/site-packages/numpy-1.19.0.dev0+8b81727-py3.8-linux-x86_64.egg/numpy/linalg/_umath_linalg.cpython-38-x86_64-linux-gnu.so我得到

linux-vdso.so.1 (0x00007ffc68bce000)
libopenblas.so.0 => /lib64/libopenblas.so.0 (0x00007fd678cc5000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd678ca3000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd678ad9000)
libm.so.6 => /lib64/libm.so.6 (0x00007fd678993000)
libgfortran.so.5 => /lib64/libgfortran.so.5 (0x00007fd6786cb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd67afe1000)
libquadmath.so.0 => /lib64/libquadmath.so.0 (0x00007fd678681000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd678664000)

因为blis_numpy/lib/python3.8/site-packages/numpy-1.19.0.dev0+8b81727-py3.8-linux-x86_64.egg/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so我得到

linux-vdso.so.1 (0x00007ffff2da9000)
libblis.so.2 => /lib64/libblis.so.2 (0x00007fd4b62b3000)
libm.so.6 => /lib64/libm.so.6 (0x00007fd4b616d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd4b614b000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd4b5f81000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd4b73d3000)
librt.so.1 => /lib64/librt.so.1 (0x00007fd4b5f76000)

那么 numpy 会使用openblasorblis吗?或者两者都有,取决于使用的功能?大多数情况下,我对采用哪条路径感兴趣numpy.linalg.eigvalsh,因为我希望一个实现或另一个实现可能会更快一些。

标签: pythonlinuxnumpyblas

解决方案


推荐阅读