如何检查 NumPy 和 SciPy 中的 BLAS/LAPACK 链接?

Posted

技术标签:

【中文标题】如何检查 NumPy 和 SciPy 中的 BLAS/LAPACK 链接?【英文标题】:How to check BLAS/LAPACK linkage in NumPy and SciPy? 【发布时间】:2012-02-18 11:40:44 【问题描述】:

我正在构建基于 blas 和 lapack 的 numpy/scipy 环境,或多或少基于this walk through。

完成后,如何检查我的 numpy/scipy 函数是否确实使用了之前构建的 blas/lapack 功能?

【问题讨论】:

【参考方案1】:

如果您安装了 anaconda-navigator(在 www.anaconda.com/anaconda/install/ 上适用于 linux、Windows 或 macOS) - blas、scipy 和 numpy 都将被安装,您可以通过单击左侧的环境选项卡来查看它们导航器主页(按字母顺序查找每个目录)。安装完整的 anaconda(相对于 miniconda 或单个软件包)将负责安装数据科学所需的许多基本软件包。

【讨论】:

【参考方案2】:

方法numpy.show_config()(或numpy.__config__.show())输出有关在构建时收集的链接信息。我的输出看起来像这样。我认为这意味着我正在使用 Mac OS 附带的 BLAS/LAPACK。

>>> import numpy as np
>>> np.show_config()

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)]

【讨论】:

鉴于其广泛的用途,numpy.__config__ 确实应该是一个公共 API。尽管如此,你赢了这一轮,davost。 那么,仅显示lapack_opt_info 就意味着numpy 与lapack 相关联? 你如何解释输出? @CecilCurry 你可以使用numpy.show_config(),由于没有下划线开头,这可能是一个公共API函数。但它没有在线记录,也没有文档字符串,因此很难找到它也就不足为奇了。希望他们能解决这个问题。 显示多个包时,如何知道实际使用的是哪个包?【参考方案3】:

您可以使用show_config()显示BLAS、LAPACK、MKL链接:

import numpy as np
np.show_config()

这对我来说给出了输出:

mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/my/environment/path/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/my/environment/path/include']

【讨论】:

你如何理解('HAVE_CBLAS', None)] @serafeim 见link。它本质上意味着HAVE_CBLAS 正在被定义但没有任何价值(想想C:#define HAVE_CBLAS)。它不需要值,因为它仅用作标志。我会将其解释为HAVE_CBLAS=True。如果你没有 CBLAS,你根本就不会有元组。 我只想知道我的 numpy 是否与 blas 相关联,以便线性代数计算足够快。我明白了:imgur.com/a/SsrDqg5。你如何解释这个? @makis numpy 链接到 openblas【参考方案4】:

您要搜索的是: system info

我用 atlas 编译了 numpy/scipy,我可以通过以下方式检查:

import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')

查看文档了解更多命令。

【讨论】:

这似乎并没有显示 numpy 当前是否使用 ATLAS,只是在下一次 numpy 编译期间是否会链接 ATLAS。我在 ATLAS 之前编译了 numpy。在我重新编译 numpy 之前它工作得非常慢(当然),但是在 numpy 重新编译 sysinfo.get_info('atlas') 之前和之后都显示了相同的输出。如何查看当前状态? 如何解释输出? 您可能安装了“blas”而不是“atlas”(如果您在基于 debian 的发行版上安装 openblas,则会发生这种情况)。 davost 的回答可能应该被接受,而不是这个回答,它未能解决手头的问题。由于此回复确实揭示了解决其他相关问题的有趣机制,因此衷心感谢! @rabra sysinfo.get_info('atlas') 没有返回给我,但sysinfo.get_info('blas') 返回了'include_dirs': ['/usr/local/include', '/usr/include', '/opt/local/include', '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/include'], 'libraries': ['blas', 'blas'], 'library_dirs': ['/usr/lib']sysinfo.get_info('lapack') 返回了'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib'] 这是什么意思?【参考方案5】:

您可以使用链接加载器依赖工具来查看构建的 C 级挂钩组件,并查看它们是否对您选择的 blas 和 lapack 有外部依赖项。我现在不在 linux 机器附近,但在 OS X 机器上,您可以在包含安装的 site-packages 目录中执行此操作:

$ otool -L numpy/core/_dotblas.so 
numpy/core/_dotblas.so:
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 268.0.1)

$ otool -L scipy/linalg/flapack.so 
scipy/linalg/flapack.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/flapack.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

$ otool -L scipy/linalg/fblas.so 
scipy/linalg/fblas.so (architecture i386):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib (compatibility version 1.0.0, current version 242.0.0)
scipy/linalg/fblas.so (architecture ppc):
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

在 gnu/Linux 系统上用 ldd 代替 otool,你应该会得到你需要的答案。

【讨论】:

如果没有文件numpy/core/_dotblas.so怎么办? (见里卡多斯回答下面的评论) @Woltan:要么有什么东西严重损坏了,要么你找错地方了。在我见过的每个 Linux 和 OS X numpy 安装中,都会有一个_dotblas.so,它是用于构建发行版的任何 blas 的接口包装器。在windows上它会被称为_dotblas.pyd,但功能是一样的。 似乎_dotblas.so 仅在您使用site.cfg 中的[atlas] 部分(以及启用CBLAS 的BLAS 库)时构建。因此,即使您不使用 ATLAS,您也应该使用它(除非您使用的是英特尔 MKL,它有一个专门的部分)。 确实,当构建 NumPy 时没有可用的 BLAS 时,它会构建自己的点积例程。这些可能比 ATLAS 慢两个数量级。 _dotblas.so no longer exists in numpy v1.10 and newer,但是可以查看multiarray.so的链接代替

以上是关于如何检查 NumPy 和 SciPy 中的 BLAS/LAPACK 链接?的主要内容,如果未能解决你的问题,请参考以下文章

numpy 和 scipy 中的阶乘

在numpy和scipy中的因子

如何删除 NumPy/SciPy 中的一些变量?

SciPy/NumPy 导入指南

如何消除由于 scipy/numpy fft 中的零填充而产生的边界效应?

Numpy 和 Scipy 的区别