How to check BLAS/LAPACK linkage in NumPy and SciPy?
Solution 1
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)]
Solution 2
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.
Solution 3
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.
Solution 4
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']
Woltan
Updated on June 16, 2020Comments
-
Woltan almost 4 years
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?
-
Woltan over 12 yearsWhat if there is no file
numpy/core/_dotblas.so
? (see comment below Ricardos answer) -
talonmies over 12 years@Woltan: either something is seriously broken, or you are looking in the wrong place. On every Linux and OS X numpy install I have ever seen, there will be a
_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. -
dmytro over 11 yearsThis doesn't seem to show whether numpy currently uses ATLAS, just whether ATLAS will be linked against during the next numpy compilation. I had numpy compiled before ATLAS. It worked very slow until I recompiled numpy (sure thing), but both before and after numpy recompilation sysinfo.get_info('atlas') shown the same output. How to check the current state of affairs?
-
Kenneth Hoste almost 11 yearsIt seems like
_dotblas.so
is only built if you're using a[atlas]
section insite.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). -
Fred Foo over 10 yearsIndeed, when no BLAS is available when NumPy is built, it builds its own dot-product routines. These can be two orders of magnitude slower than ATLAS.
-
Bruno Feroleto over 10 yearsHow to interpret the output?
-
Malcolm over 10 yearsYou might have 'blas' instead of 'atlas' installed (this happens if you install openblas on debian based distros).
-
ali_m over 8 years
_dotblas.so
no longer exists in numpy v1.10 and newer, but you can check the linkage ofmultiarray.so
instead -
Kenneth Hoste over 8 yearsHere's a nice way (it seems):
nm /path/to/numpy/core/multiarray.so | grep blas_dot
. If there's noblas_dot
symbol, then numpy is not linked against BLAS (for v1.10 and up) -
Cecil Curry about 8 yearsdavost's answer should probably have been accepted in lieu of this response, which fails to address the question at hand. Since this response does uncover interesting machinery of use in solving other related questions, a hearty thanks all the same!
-
Cecil Curry about 8 yearsGiven its widespread usefulness,
numpy.__config__
should really be a public API. Nonetheless, you win this round, davost. -
DanHickstein about 8 yearsSo, the mere fact that
lapack_opt_info
is shown means that numpy is linked with lapack? -
Edward Newell about 8 yearsHow do you interpret the output?
-
Praveen about 7 years@CecilCurry You can use
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. -
Jonasson about 7 yearshow do I find out which package is actually used when multiple packages are displayed?
-
SebMa almost 7 years@rabra
sysinfo.get_info('atlas')
returned nothing for me butsysinfo.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']}
andsysinfo.get_info('lapack')
returned{'language': 'f77', 'libraries': ['lapack', 'lapack'], 'library_dirs': ['/usr/lib']}
What does it mean ? -
BallpointBen almost 6 years@davost, how did you install
numpy
? Which version of Python are you using? -
seralouk almost 5 yearsHow do you interpret
('HAVE_CBLAS', None)]
? -
M.T almost 5 years@serafeim See link. It essentially means that
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 asHAVE_CBLAS=True
. If you did not have CBLAS, you would not have the tuple there at all. -
endolith over 4 yearsThis returns nothing but an empty set 👎
-
seralouk over 4 yearsI want just to know if my numpy is linked to blas so that linear algebra computation are fast enough. I get this: imgur.com/a/SsrDqg5. How do you interpret this?
-
seralouk over 4 yearsI want just to know if my numpy is linked to blas so that linear algebra computation are fast enough. I get this: imgur.com/a/SsrDqg5. How do you interpret this?
-
M.T over 4 years@makis numpy is linked to openblas
-
mdeff about 4 yearsBe careful: this information is gathered at build time. As BLAS and LAPACK are standard interfaces, it's possible to build against netlib's reference implementation (which is slow) while dynamically linking to the optimized OpenBLAS implementation at runtime.