【发布时间】:2012-02-18 11:40:44
【问题描述】:
我正在构建基于 blas 和 lapack 的 numpy/scipy 环境,或多或少基于this walk through。
完成后,如何检查我的 numpy/scipy 函数是否确实使用了之前构建的 blas/lapack 功能?
【问题讨论】:
标签: python numpy scipy lapack blas
我正在构建基于 blas 和 lapack 的 numpy/scipy 环境,或多或少基于this walk through。
完成后,如何检查我的 numpy/scipy 函数是否确实使用了之前构建的 blas/lapack 功能?
【问题讨论】:
标签: python numpy scipy lapack blas
如果您安装了 anaconda-navigator(在 www.anaconda.com/anaconda/install/ 上适用于 linux、Windows 或 macOS) - blas、scipy 和 numpy 都将被安装,您可以通过单击左侧的环境选项卡来查看它们导航器主页(按字母顺序查找每个目录)。安装完整的 anaconda(相对于 miniconda 或单个软件包)将负责安装数据科学所需的许多基本软件包。
【讨论】:
方法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 相关联?
numpy.show_config(),由于没有下划线开头,这可能是一个公共API函数。但它没有在线记录,也没有文档字符串,因此很难找到它也就不足为奇了。希望他们能解决这个问题。
您可以使用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)]?
HAVE_CBLAS 正在被定义但没有任何价值(想想C:#define HAVE_CBLAS)。它不需要值,因为它仅用作标志。我会将其解释为HAVE_CBLAS=True。如果你没有 CBLAS,你根本就不会有元组。
您要搜索的是: system info
我用 atlas 编译了 numpy/scipy,我可以通过以下方式检查:
import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')
查看文档了解更多命令。
【讨论】:
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']} 这是什么意思?
您可以使用链接加载器依赖工具来查看构建的 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怎么办? (见里卡多斯回答下面的评论)
_dotblas.so,它是用于构建发行版的任何 blas 的接口包装器。在windows上它会被称为_dotblas.pyd,但功能是一样的。
_dotblas.so 仅在您使用site.cfg 中的[atlas] 部分(以及启用CBLAS 的BLAS 库)时构建。因此,即使您不使用 ATLAS,您也应该使用它(除非您使用的是英特尔 MKL,它有一个专门的部分)。
_dotblas.so no longer exists in numpy v1.10 and newer,但是可以查看multiarray.so的链接代替