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

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

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

【问题讨论】:

    标签: python numpy scipy lapack blas


    【解决方案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的链接代替
      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多