【问题标题】:Find out if/which BLAS library is used by Numpy找出 Numpy 是否/使用哪个 BLAS 库
【发布时间】:2016-09-08 03:39:20
【问题描述】:

我在不同的环境(MacOS、Ubuntu、RedHat)中使用 numpy 和 scipy。 通常我使用可用的包管理器(例如,mac ports、apt、yum)安装 numpy。

但是,如果您不手动编译 Numpy,如何确定它使用 BLAS 库?使用 mac 端口,ATLAS 作为依赖项安装。但是,我不确定它是否真的被使用过。当我执行一个简单的基准测试时,numpy.dot() 函数需要大约。时间是使用 Eigen C++ 库计算的点积的 2 倍。我不确定这是否是一个合理的结果。

【问题讨论】:

    标签: python c++ macos numpy blas


    【解决方案1】:

    numpy.show_config() 并不总是提供可靠的信息。例如,如果我在 Ubuntu 14.04 上apt-get install python-numpynp.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 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
    

    【讨论】:

    • 如果ldd /&lt;path_to_site-packages&gt;/numpy/core/multiarray.so 的答案更高,我将不胜感激。
    • 看起来在 numpy 1.16 中,multiarray 被重新组织了。我不得不跑ldd numpy/core/_multiarray_umath.cpython-36m-x86_64-linux-gnu.so
    【解决方案2】:

    numpy.show_config() 只是告诉我在我的 Debian Linux 上没有可用的信息。

    但是 /usr/lib/python3/dist-packages/scipy/lib 有一个 blas 的子目录,它可能会告诉你你想要什么。在子目录 tests 中有几个 BLAS 测试程序。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      您想查看numpy.show_config() 以查看配置了哪些库。

      最新的mkl 应该显示libraries = ['mkl_rt'],在此之前它应该包含几个mkl_ 库。另见here

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 2011-10-10
        • 1970-01-01
        相关资源
        最近更新 更多