繁体   English   中英

没有OpenBLAS,为什么numpy / scipy更快?

[英]Why numpy/scipy is faster without OpenBLAS?

我做了两个安装:

  1. brew install numpy (和scipy)-- --with-openblas
  2. 克隆的GIT存储库(用于numpy和scipy)并自己构建它

在克隆了两个方便的脚本以在多线程环境中验证这些库之后:

git clone https://gist.github.com/3842524.git

然后对于每个安装我正在执行show_config

python -c "import scipy as np; np.show_config()"

对于安装1来说一切都很好:

lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/opt/openblas/lib']
    language = f77
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/opt/openblas/lib']
    language = f77
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/opt/openblas/lib']
    language = f77
blas_mkl_info:
    NOT AVAILABLE

但安装2事情并不那么光明:

lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '- I/System/Library/Frameworks/vecLib.framework/Headers']
define_macros = [('NO_ATLAS_INFO', 3)]

所以当我无法正确链接OpenBLAS时。 但现在好了,这里是性能结果。 所有测试均在iMac,Yosemite,i7-4790K,4核,超线程上进行。

首次安装OpenBLAS:

numpy的:

OMP_NUM_THREADS=1 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.126578998566 sec

OMP_NUM_THREADS=2 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.0640147686005 sec

OMP_NUM_THREADS=4 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.0360922336578 sec

OMP_NUM_THREADS=8 python test_numpy.py
FAST BLAS
version: 1.9.2
maxint: 9223372036854775807
dot: 0.0364527702332 sec

SciPy的:

OMP_NUM_THREADS=1 python test_scipy.py
cholesky: 0.0276656150818 sec
svd: 0.732437372208 sec

OMP_NUM_THREADS=2 python test_scipy.py
cholesky: 0.0182101726532 sec
svd: 0.441690778732 sec

OMP_NUM_THREADS=4 python test_scipy.py
cholesky: 0.0130400180817 sec
svd: 0.316107988358 sec

OMP_NUM_THREADS=8 python test_scipy.py
cholesky: 0.012854385376 sec
svd: 0.315939807892 sec

没有OpenBLAS的第二次安装:

numpy的:

OMP_NUM_THREADS=1 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0371072292328 sec

OMP_NUM_THREADS=2 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0215149879456 sec

OMP_NUM_THREADS=4 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0146862030029 sec

OMP_NUM_THREADS=8 python test_numpy.py
slow blas
version: 1.10.0.dev0+3c5409e
maxint: 9223372036854775807
dot: 0.0141334056854 sec

SciPy的:

OMP_NUM_THREADS=1 python test_scipy.py
cholesky: 0.0109382152557 sec
svd: 0.32529540062 sec

OMP_NUM_THREADS=2 python test_scipy.py
cholesky: 0.00988121032715 sec
svd: 0.331357002258 sec

OMP_NUM_THREADS=4 python test_scipy.py
cholesky: 0.00916676521301 sec
svd: 0.318637990952 sec

OMP_NUM_THREADS=8 python test_scipy.py
cholesky: 0.00931282043457 sec
svd: 0.324427986145 sec

令我惊讶的是,第二种情况比第一种情况要快。 在scipy的情况下,添加更多内核后性能没有增加,但即使一个内核比OpenBLAS中的4个内核更快。

有谁知道为什么会这样?

有两个明显的差异可能导致差异:

  1. 你正在比较两个不同的版本numpy。 使用Homebrew安装的OpenBLAS链接版本是1.9.1,而您从源代码构建的版本是1.10.0.dev0 + 3c5409e。

  2. 虽然较新版本与OpenBLAS没有关联,但它与Apple的Accelerate Framework相关联,这是一种不同的优化BLAS实现。


您的测试脚本仍然报告第二种情况的slow blas的原因是由于与最新版本的numpy不兼容。 您正在使用的脚本通过检查是否存在numpy.core._dotblas来测试numpy是否与优化的BLAS库numpy.core._dotblas

try:
    import numpy.core._dotblas
    print 'FAST BLAS'
except ImportError:
    print 'slow blas'

在numpy的旧版本中,如果找到优化的BLAS库,则只能在安装过​​程中编译此C模块。 但是, 在开发版本> 1.10.0中已经完全删除了_dotblas (正如之前的SO问题所述 ),因此脚本将始终报告这些版本的slow blas

我已经编写了numpy测试脚本的更新版本,它可以正确报告最新版本的BLAS链接; 你可以在这里找到它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM