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


126

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

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

Answers:


293

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

4
鉴于其广泛的用途,numpy.__config__实际上应该是一个公共API。尽管如此达沃斯特还是赢得了这一回合。
塞西尔·库里

2
那么,仅显示的事实lapack_opt_info意味着numpy与lapack相连?
DanHickstein'3

42
您如何解释输出?
爱德华·纽厄尔

18
@CecilCurry您可以使用numpy.show_config(),由于缺少下划线,它可能是公共API函数。但是它没有在线记录,也没有文档字符串,因此很难找到它也就不足为奇了。希望他们能解决这个问题。
Praveen

8
显示多个软件包时,如何找出实际使用的软件包?
乔纳森

28

您要搜索的是: 系统信息

我用地图集编译了numpy / scipy,我可以使用以下命令进行检查:

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

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


35
这似乎并未显示numpy当前是否使用ATLAS,仅显示在下一次numpy编译期间是否会链接ATLAS。我在ATLAS之前编译了numpy。在我重新编译numpy(确定的事情)之前,它的工作非常缓慢,但是在numpy重新编译之前和之后sysinfo.get_info('atlas')都显示了相同的输出。如何查看当前的状况?
dmytro

4
如何解释输出?
Eric O Lebigot

2
您可能安装了“ blas”而不是“ atlas”(如果在基于debian的发行版上安装openblas,则会发生这种情况)。
马尔科姆

4
davost的答案可能应该代替该回答被接受,该回答无法解决当前的问题。由于此回答确实揭示了用于解决其他相关问题的有趣机制,因此衷心感谢!
塞西尔·库里

2
@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']}是什么意思?
SebMa

11

由于它使用动态加载的版本,因此您可以执行以下操作:

$ ldd anyoftheCmodules.so

anyoftheCmodules.so例如,numpy/core/_dotblas.so链接到的位置在哪里libblas.so


1
如果没有文件numpy/core/_dotblas.so怎么办?(请参见以下关于talonmies答案的评论)
Woltan 2012年

1
那里只能有一些.so文件。只需在NumPy目录中搜索(例如,使用find /path/to/numpy -name "*.so")。其中的几个(例如_dotblas.solapack_lite.so在Ubuntu的预编译版本下)使用BLAS / LAPACK
RicardoCárdenes2012年

6
_dotblas.so不再存在numpy的1.10和更新的,但你可以检查的联动multiarray.so,而不是
ali_m

应该提到的是,该解决方案既是特定于Linux的,也是脆弱的。您确实真的只想numpy.__config__在运行时访问规范对象。(请参阅davost的出色回答。)
Cecil Curry,

确实,这是特定于Linux的,我同意@davost方法更好。我不明白为什么我的答案会不断被推高。
里卡多·卡德尼斯(RicardoCárdenes)'16

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)

代替ldd代替otool一个GNU / Linux系统上,你应该得到你所需要的答案。


1
如果没有文件numpy/core/_dotblas.so怎么办?(请参阅Ricardos回答下方的评论)
Woltan

@Woltan:某些东西严重损坏,或者您在错误的地方看。在我所见过的每一个Linux和OS X numpy安装中,都会使用_dotblas.so哪一个接口来包装用于构建发行版的内容。在Windows上将称为_dotblas.pyd,但功能相同。
talonmies 2012年

3
似乎_dotblas.so只有在使用中的[atlas]部分site.cfg(和启用了CBLAS的BLAS库)中才能构建。因此,即使您没有使用ATLAS,也应该使用它(除非使用Intel MKL时有​​专门的部分)。
肯尼斯·哈斯特

确实,当构建NumPy时没有可用的BLAS时,它将构建自己的点积例程。这可能比ATLAS慢两个数量级。
Fred Foo 2013年

5
_dotblas.so不再存在numpy的1.10和更新的,但你可以检查的联动multiarray.so,而不是
ali_m

6

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

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

1
您如何解释('HAVE_CBLAS', None)]
seralouk

@serafeim请参阅链接。从本质上讲,这意味着HAVE_CBLAS正在定义但没有任何价值(请考虑C:)#define HAVE_CBLAS。它不需要值,因为它仅用作标志。我将其解释为HAVE_CBLAS=True。如果您没有CBLAS,则根本就没有元组。
MT

我只想知道我的numpy是否链接到blas,以便线性代数计算足够快。我得到这个:imgur.com/a/SsrDqg5。您如何解释呢?
seralouk

@makis numpy链接到openblas
MT

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.