如何检查 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 的回答可能应该被接受,而不是这个回答,它未能解决手头的问题。由于此回复确实揭示了解决其他相关问题的有趣机制,因此衷心感谢! @rabrasysinfo.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 链接?的主要内容,如果未能解决你的问题,请参考以下文章