我正在基于这篇文章搭建基于BLAS和LAPACK的numpy/scipy环境。
在完成后,我该如何检查我的numpy/scipy函数确实使用了先前构建的BLAS/LAPACK功能?
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)]
import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')
查看文档以获取更多命令。
sysinfo.get_info('atlas')
对我来说没有返回任何内容,但是 sysinfo.get_info('blas')
返回了以下内容: '/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你可以使用链接加载器工具来查看构建过程中 C 级别钩子组件是否依赖于你选择的 BLAS 和 LAPACK。我现在不在 Linux 系统上,但在 Mac 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
会怎样?(请参见Ricardo答案下面的评论) - Woltan_dotblas.so
,它是接口包装器,用于构建分发所使用的任何blas。在Windows上,它将被称为_dotblas.pyd
,但功能是相同的。 - talonmiessite.cfg
文件的[atlas]
部分中使用了启用CBLAS的BLAS库,则似乎只会构建_dotblas.so
文件。因此,即使您没有使用ATLAS(除非您使用具有专用部分的Intel MKL),也应该使用它。 - Kenneth Hoste_dotblas.so
在numpy v1.10及更高版本中已经不存在,但您可以检查multiarray.so
的链接。 - ali_mnm /path/to/numpy/core/multiarray.so | grep blas_dot
。
如果没有 blas_dot
符号,则 numpy 没有链接到 BLAS(对于 v1.10 及以上版本)。 - Kenneth Hosteshow_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)]
? - seraloukHAVE_CBLAS
,但没有值(类似于C语言中的#define HAVE_CBLAS
)。它不需要一个值,因为它只被用作标志。我会将其解释为HAVE_CBLAS=True
。如果您没有CBLAS,则根本不会在元组中出现。 - M.T
numpy.show_config()
,这可能是一个公共的 API 函数,因为它没有下划线前缀。但它没有在线文档并且没有文档字符串,所以难以找到也不奇怪。希望他们会解决这个问题。 - Praveen