I am builing my numpy/scipy environment based on blas and lapack more or less based on this walk through.
When I am done, how can I check, that my numpy/scipy functions really do use the previously built blas/lapack functionalities?
I am builing my numpy/scipy environment based on blas and lapack more or less based on this walk through.
When I am done, how can I check, that my numpy/scipy functions really do use the previously built blas/lapack functionalities?
The method numpy.show_config()
(or numpy.__config__.show()
) outputs information about linkage gathered at build time. My output looks like this. I think it means I am using the BLAS/LAPACK that ships with Mac OS.
>>> 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)]
lapack_opt_info
is shown means that numpy is linked with lapack? –
Patrick numpy.show_config()
, which is probably a public API function by virtue of the absence of starting underscores. But it's not documented online and has no docstring, so it's no surprise that it's so hard to find. Hopefully they'll fix that. –
Container numpy
? Which version of Python are you using? –
Trona What you are searching for is this: system info
I compiled numpy/scipy with atlas and i can check this with:
import numpy.distutils.system_info as sysinfo
sysinfo.get_info('atlas')
Check the documentation for more commands.
sysinfo.get_info('atlas')
returned nothing for me but sysinfo.get_info('blas')
returned {'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']}
and sysinfo.get_info('lapack')
returned {'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']}
What does it mean ? –
Poly numpy.distutils
is deprecated since NumPy 1.23.0, as a result of the deprecation of distutils
itself. It will be removed for Python >= 3.12. For older Python versions it will remain present." –
Coot You can use the link loader dependency tool to look at the C level hook components of your build and see whether they have external dependencies on your blas and lapack of choice. I am not near a linux box right now, but on an OS X machine you can do this inside the site-packages directory which holds the installations:
$ 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)
substitute ldd
in place of otool
on a gnu/Linux system and you should get the answers you need.
numpy/core/_dotblas.so
? (see comment below Ricardos answer) –
Abele _dotblas.so
which is the interface wrapper to whatever blas has been used to build the distribution. On windows it will be called _dotblas.pyd
, but the function is the same. –
Babble _dotblas.so
is only built if you're using a [atlas]
section in site.cfg
(and a CBLAS-enabled BLAS library). So, you should use that, even if you're not using ATLAS (except when you're using Intel MKL, that has a dedicated section). –
Botello _dotblas.so
no longer exists in numpy v1.10 and newer, but you can check the linkage of multiarray.so
instead –
Aerate nm /path/to/numpy/core/multiarray.so | grep blas_dot
. If there's no blas_dot
symbol, then numpy is not linked against BLAS (for v1.10 and up) –
Botello You can display BLAS, LAPACK, MKL linkage using show_config()
:
import numpy as np
np.show_config()
Which for me gives output:
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)]
? –
Kyd HAVE_CBLAS
is being defined but has no value (think C: #define HAVE_CBLAS
). It does not need a value as it is only used as a flag. I would interpret it as HAVE_CBLAS=True
. If you did not have CBLAS, you would not have the tuple there at all. –
Stratagem If you installed anaconda-navigator (at www.anaconda.com/anaconda/install/ for linux, Windows or macOS) - blas, scipy and numpy will all be installed and you can see them by clicking environments tab on left side of navigator home page (look for each directory in alpha order). Installing full anaconda (as opposed to miniconda or individual packages) will take care of installing many of the essential packages needed for data science.
© 2022 - 2025 — McMap. All rights reserved.
numpy.__config__
should really be a public API. Nonetheless, you win this round, davost. – Limbert