找出 if/which Numpy 使用的 BLAS 库
Find out if/which BLAS library is used by Numpy
我在不同的环境(MacOS、Ubuntu、RedHat)中使用 numpy 和 scipy。
通常我使用可用的包管理器安装 numpy(例如 mac ports、apt、yum)。
但是,如果你不手动编译Numpy,你怎么确定它使用的是BLAS库呢?使用 mac 端口,ATLAS 作为依赖项安装。但是,我不确定它是否真的被使用过。当我执行一个简单的基准测试时,numpy.dot()
函数需要大约。是使用 Eigen C++ 库计算点积的时间的 2 倍。我不确定这是否是一个合理的结果。
您想检查 numpy.show_config()
以查看配置了哪些库。
最新的 mkl
应该显示 libraries = ['mkl_rt']
,在此之前它应该包含几个 mkl_
库。另见 here。
numpy.show_config() 只是告诉我在我的 Debian Linux 上没有可用的信息。
但是 /usr/lib/python3/dist-packages/scipy/lib 有一个 blas 子目录,它可能会告诉您您想要什么。子目录 tests 中有几个 BLAS 测试程序。
希望对您有所帮助。
numpy.show_config()
并不总是提供可靠的信息。例如,如果我在 Ubuntu 14.04 上 apt-get install python-numpy
,则 np.show_config()
的输出如下所示:
blas_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
lapack_info:
libraries = ['lapack']
library_dirs = ['/usr/lib']
language = f77
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['lapack', 'blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
...
看起来 numpy 使用的是标准 CBLAS 库。但是,我知道 numpy 正在使用我通过 libopenblas-dev
包安装的 OpenBLAS。
检查 *nix 最明确的方法是使用 ldd
找出 numpy 在运行时链接到哪些共享库(我没有 Mac,但我认为你可以使用 otool -L
代替 ldd
).
对于早于 v1.10 的 numpy 版本:
~$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
如果 _dotblas.so
不存在,这可能意味着 numpy 在最初编译时未能检测到任何 BLAS 库,在这种情况下,它根本不构建任何依赖 BLAS 的组件。
对于 numpy v1.10 和更新版本:
_dotblas.so
has been removed,但您可以改为检查 multiarray.so
的依赖项:
~$ ldd /<path_to_site-packages>/numpy/core/multiarray.so
查看我通过 apt-get
安装的 numpy 版本:
~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so
linux-vdso.so.1 => (0x00007fff12db8000)
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fce7b028000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce7ac60000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce7a958000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fce7a738000)
/lib64/ld-linux-x86-64.so.2 (0x00007fce7ca40000)
/usr/lib/libblas.so.3
实际上是符号链接链的开始。如果我使用 readlink -e
跟随他们到达他们的最终目标,我会看到他们指向我的 OpenBLAS 共享库:
~$ readlink -e /usr/lib/libblas.so.3
/usr/lib/openblas-base/libblas.so.3
我在不同的环境(MacOS、Ubuntu、RedHat)中使用 numpy 和 scipy。 通常我使用可用的包管理器安装 numpy(例如 mac ports、apt、yum)。
但是,如果你不手动编译Numpy,你怎么确定它使用的是BLAS库呢?使用 mac 端口,ATLAS 作为依赖项安装。但是,我不确定它是否真的被使用过。当我执行一个简单的基准测试时,numpy.dot()
函数需要大约。是使用 Eigen C++ 库计算点积的时间的 2 倍。我不确定这是否是一个合理的结果。
您想检查 numpy.show_config()
以查看配置了哪些库。
最新的 mkl
应该显示 libraries = ['mkl_rt']
,在此之前它应该包含几个 mkl_
库。另见 here。
numpy.show_config() 只是告诉我在我的 Debian Linux 上没有可用的信息。
但是 /usr/lib/python3/dist-packages/scipy/lib 有一个 blas 子目录,它可能会告诉您您想要什么。子目录 tests 中有几个 BLAS 测试程序。
希望对您有所帮助。
numpy.show_config()
并不总是提供可靠的信息。例如,如果我在 Ubuntu 14.04 上 apt-get install python-numpy
,则 np.show_config()
的输出如下所示:
blas_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
lapack_info:
libraries = ['lapack']
library_dirs = ['/usr/lib']
language = f77
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['lapack', 'blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
...
看起来 numpy 使用的是标准 CBLAS 库。但是,我知道 numpy 正在使用我通过 libopenblas-dev
包安装的 OpenBLAS。
检查 *nix 最明确的方法是使用 ldd
找出 numpy 在运行时链接到哪些共享库(我没有 Mac,但我认为你可以使用 otool -L
代替 ldd
).
对于早于 v1.10 的 numpy 版本:
~$ ldd /<path_to_site-packages>/numpy/core/_dotblas.so
如果
_dotblas.so
不存在,这可能意味着 numpy 在最初编译时未能检测到任何 BLAS 库,在这种情况下,它根本不构建任何依赖 BLAS 的组件。对于 numpy v1.10 和更新版本:
_dotblas.so
has been removed,但您可以改为检查multiarray.so
的依赖项:~$ ldd /<path_to_site-packages>/numpy/core/multiarray.so
查看我通过 apt-get
安装的 numpy 版本:
~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so
linux-vdso.so.1 => (0x00007fff12db8000)
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fce7b028000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce7ac60000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce7a958000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fce7a738000)
/lib64/ld-linux-x86-64.so.2 (0x00007fce7ca40000)
/usr/lib/libblas.so.3
实际上是符号链接链的开始。如果我使用 readlink -e
跟随他们到达他们的最终目标,我会看到他们指向我的 OpenBLAS 共享库:
~$ readlink -e /usr/lib/libblas.so.3
/usr/lib/openblas-base/libblas.so.3