我在不同的环境下(MacOS,Ubuntu,RedHat)都使用numpy和scipy。通常我会使用可用的包管理器(例如mac ports、apt、yum)安装numpy。
然而,如果您没有手动编译Numpy,您如何确定它使用了BLAS库?使用mac ports时,ATLAS会被安装为依赖项。但是,我不确定它是否真正被使用。当我执行一个简单的基准测试时,numpy.dot()
函数所需的时间约为使用Eigen C++库计算点积的时间的两倍。我不确定这是否是一个合理的结果。
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正在使用OpenBLAS,我是通过安装libopenblas-dev
软件包来实现的。
在*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
已被删除,但您可以检查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
numpy.show_config() 只是告诉我在我的 Debian Linux 上没有可用的信息。
然而,/usr/lib/python3/dist-packages/scipy/lib 有一个子目录用于 blas,这可能会告诉你想要的信息。子目录 tests 中有几个 BLAS 的测试程序。
希望这可以帮助到你。
ldd /<path_to_site-packages>/numpy/core/multiarray.so
更靠前,我会很感激。 - Martin Thomaldd numpy/core/_multiarray_umath.cpython-36m-x86_64-linux-gnu.so
。 - Quantum7