BLAS and LAPACK — NumPy v2.4.dev0 Manual (original) (raw)
Default behavior for BLAS and LAPACK selection#
When a NumPy build is invoked, BLAS and LAPACK library detection happens automatically. The build system will attempt to locate a suitable library, and try a number of known libraries in a certain order - most to least performant. A typical order is: MKL, Accelerate, OpenBLAS, FlexiBLAS, BLIS, plain libblas
/liblapack
. This may vary per platform or over releases. That order, and which libraries are tried, can be changed through theblas-order
and lapack-order
build options, for example:
$ python -m pip install . -Csetup-args=-Dblas-order=openblas,mkl,blis -Csetup-args=-Dlapack-order=openblas,mkl,lapack
The first suitable library that is found will be used. In case no suitable library is found, the NumPy build will print a warning and then use (slow!) NumPy-internal fallback routines. In order to disallow use of those slow routines, the allow-noblas
build option can be used:
$ python -m pip install . -Csetup-args=-Dallow-noblas=false
By default the LP64 (32-bit integer) interface to BLAS and LAPACK will be used. For building against the ILP64 (64-bit integer) interface, one must use theuse-ilp64
build option:
$ python -m pip install . -Csetup-args=-Duse-ilp64=true
Selecting specific BLAS and LAPACK libraries#
The blas
and lapack
build options are set to “auto” by default, which means trying all known libraries. If you want to use a specific library, you can set these build options to the library name (typically the lower-case name that pkg-config
expects). For example, to select plain libblas
andliblapack
(this is typically Netlib BLAS/LAPACK on Linux distros, and can be dynamically switched between implementations on conda-forge), use:
$ # for a development build $ spin build -C-Dblas=blas -C-Dlapack=lapack
$ # to build and install a wheel $ python -m build -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack $ pip install dist/numpy*.whl
$ # Or, with pip>=23.1, this works too: $ python -m pip install . -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack
Other options that should work (as long as they’re installed withpkg-config
support; otherwise they may still be detected but things are inherently more fragile) include openblas
, mkl
, accelerate
,atlas
and blis
.
Using pkg-config to detect libraries in a nonstandard location#
The way BLAS and LAPACK detection works under the hood is that Meson tries to discover the specified libraries first with pkg-config
, and then with CMake. If all you have is a standalone shared library file (e.g.,armpl_lp64.so
in /a/random/path/lib/
and a corresponding header file in /a/random/path/include/
), then what you have to do is craft your own pkg-config file. It should have a matching name (so in this example, armpl_lp64.pc
) and may be located anywhere. ThePKG_CONFIG_PATH
environment variable should be set to point to the location of the .pc
file. The contents of that file should be:
libdir=/path/to/library-dir # e.g., /a/random/path/lib includedir=/path/to/include-dir # e.g., /a/random/path/include version=1.2.3 # set to actual version extralib=-lm -lpthread -lgfortran # if needed, the flags to link in dependencies Name: armpl_lp64 Description: ArmPL - Arm Performance Libraries Version: ${version} Libs: -L${libdir} -larmpl_lp64 # linker flags Libs.private: ${extralib} Cflags: -I${includedir}
To check that this works as expected, you should be able to run:
$ pkg-config --libs armpl_lp64 -L/path/to/library-dir -larmpl_lp64 $ pkg-config --cflags armpl_lp64 -I/path/to/include-dir
Full list of BLAS and LAPACK related build options#
BLAS and LAPACK are complex dependencies. Some libraries have more options that are exposed via build options (see meson.options
in the root of the repo for all of NumPy’s build options).
blas
: name of the BLAS library to use (default:auto
),lapack
: name of the LAPACK library to use (default:auto
),allow-noblas
: whether or not to allow building without external BLAS/LAPACK libraries (default:true
),blas-order
: order of BLAS libraries to try detecting (default may vary per platform),lapack-order
: order of LAPACK libraries to try detecting,use-ilp64
: whether to use the ILP64 interface (default:false
),blas-symbol-suffix
: the symbol suffix to use for the detected libraries (default:auto
),mkl-threading
: which MKL threading layer to use, one ofseq
,iomp
,gomp
,tbb
(default:auto
).