如何检查numpy/scipy中的blas/lapack链接?

Wol*_*tan 125 python numpy blas scipy lapack

我正在建立我的numpy/scipy环境基于blas和lapack或多或少基于这个步骤.

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

小智 290

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

>>>import numpy as np
>>>np.__config__.show()

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)]
Run Code Online (Sandbox Code Playgroud)

  • 你怎么解释输出? (38认同)
  • @CecilCurry您可以使用`numpy.show_config()`,由于缺少起始下划线,它可能是一个公共API函数.但它没有在线记录,也没有文档字符串,因此很难找到它.希望他们能解决这个问题. (16认同)
  • 鉴于其广泛的用途,`numpy .__ config__`应该是一个公共API.尽管如此,**你赢了这轮,[davost](/sf/users/201390241/).** (4认同)
  • 如何在显示多个包时找出实际使用的包? (4认同)
  • 那么,显示`lapack_opt_info`这一事实意味着numpy与lapack相关联? (2认同)

rab*_*bra 28

您要搜索的是: 系统信息

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

import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')
Run Code Online (Sandbox Code Playgroud)

查看文档以获取更多命令.

  • 这似乎并没有表明numpy目前是否使用ATLAS,只是ATLAS是否会在下一次numpy编译中被链接.我在ATLAS之前编译了numpy.它工作得很慢,直到我重新编译numpy(确定的事情),但在numpy重新编译之前和之后,sysinfo.get_info('atlas')显示相同的输出.如何查看当前的情况? (34认同)
  • 如何解释输出? (4认同)
  • 应该接受[davost](/sf/users/201390241/)的答案来代替这个答案,而这个答案无法解决手头的问题.由于此响应确实发现了解决其他相关问题的有趣机制,所以同样衷心感谢! (4认同)
  • 您可能安装了'blas'而不是'atlas'(如果您在基于debian的发行版上安装openblas,就会发生这种情况). (2认同)
  • @rabra`sysinfo.get_info('atlas')`对我什么都没有返回,但是`sysinfo.get_info('blas')`返回了'``{'include_dirs':['/ usr / local / include','/ usr /包括”,“ / opt / local / include”,“ / usr / local / Cellar / python / 2.7.13 / Frameworks / Python.framework / Versions / 2.7 / include”],“库”:['blas',' blas'],'library_dirs':['/ usr / lib']}`和sysinfo.get_info('lapack')`返回```{'language':'f77','libraries':[' lapack','lapack'],'library_dirs':['/ usr / lib']}`````是什么意思? (2认同)

Ric*_*nes 11

由于它使用动态加载的版本,您可以这样做:

$ ldd anyoftheCmodules.so
Run Code Online (Sandbox Code Playgroud)

anyoftheCmodules.so例如,哪里可以numpy/core/_dotblas.so链接到哪里libblas.so.

  • [`_dotblas.so`在numpy v1.10和更新版本中不再存在](http://docs.scipy.org/doc/numpy-dev/release.html#dropped-support),但你可以检查链接`multiarray.so`而不是 (6认同)

tal*_*ies 8

您可以使用链接加载器依赖工具来查看构建的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)
Run Code Online (Sandbox Code Playgroud)

替换lddotoolgnu/Linux系统上代替,你应该得到你需要的答案.

  • [`_dotblas.so`在numpy v1.10和更新版本中不再存在](http://docs.scipy.org/doc/numpy-dev/release.html#dropped-support),但你可以检查链接`multiarray.so`而不是 (5认同)
  • 这似乎是`如果你使用`site.cfg`一个`[图集]`部分(和启用CBLAS-BLAS库)_dotblas.so`只建.所以,你应该使用它,即使你没有使用ATLAS(除非你使用的是英特尔MKL,它有专门的部分). (3认同)
  • 如果没有文件“numpy/core/_dotblas.so”怎么办?(参见里卡多回答下面的评论) (2认同)

M.T*_*M.T 7

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

import numpy as np
np.show_config()
Run Code Online (Sandbox Code Playgroud)

这对我来说给出了输出:

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']
Run Code Online (Sandbox Code Playgroud)

  • @serafeim 请参阅[链接](https://github.com/python/cpython/blob/master/Lib/distutils/extension.py#L37)。它本质上意味着“HAVE_CBLAS”正在被定义,但没有任何值(想想C:“#define HAVE_CBLAS”)。它不需要值,因为它仅用作标志。我会将其解释为“HAVE_CBLAS=True”。如果您没有 CBLAS,则根本不会有该元组。 (4认同)
  • 你如何解释`('HAVE_CBLAS', None)]`? (3认同)