python - 如果与多个实现链接,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 会使用openblas
orblis
吗?或者两者都有,取决于使用的功能?大多数情况下,我对采用哪条路径感兴趣numpy.linalg.eigvalsh
,因为我希望一个实现或另一个实现可能会更快一些。
解决方案
推荐阅读
- c - 无法定义共享内存对象的大小
- python - Python 矩阵乘法逐行与示例代码
- c# - .Net Standard 2.0 生成 NuGet 包,包括同一解决方案中的项目和 NuGet 包
- python - 如何使用 Django 获取最新日期?
- keycloak - 如何配置 keycloak 将其数据存储在加密的数据库中?
- windows - 虚拟机上的 Docker
- python - 本地主机上没有发布方法?
- cassandra - Java驱动程序中CQL count() 的等价物是什么
- python - 检测来自物理源的特定声音并记录日期/时间
- kubernetes - CronJob 的 Kubernetes pod 生命周期通知