BLAS and LAPACK#
BLAS 和 LAPACK 选择的默认行为#
调用 NumPy 构建时,BLAS 和 LAPACK 库检测会自动发生。构建系统将尝试找到一个合适的库,并按一定顺序尝试多个已知库,从性能最好的到最差的顺序。典型顺序为:MKL、加速库、OpenBLAS、FlexiBLAS、BLIS、普通 libblas
/liblapack
。它可能会因平台或版本而异。可以通过 blas-order
和 lapack-order
构建选项来更改此顺序和尝试哪些库,例如:
$ python -m pip install . -Csetup-args=-Dblas-order=openblas,mkl,blis -Csetup-args=-Dlapack-order=openblas,mkl,lapack
将使用找到的第一个合适的库。如果没有找到合适的库,NumPy 构建会打印一个警告,然后使用(较慢的!)NumPy 内部后备例程。为了禁止使用那些较慢的例程,可以使用 allow-noblas
构建选项
$ python -m pip install . -Csetup-args=-Dallow-noblas=false
默认情况下,将使用 LP64(32 位整数)接口针对 BLAS 和 LAPACK。对于针对 ILP64(64 位整数)接口构建,必须使用 use-ilp64
构建选项
$ python -m pip install . -Csetup-args=-Duse-ilp64=true
选择特定的 BLAS 和 LAPACK 库#
默认情况下会将 blas
和 lapack
构建选项设置为“自动”,这意味着尝试所有已知库。如果你想使用特定库,可以将这些构建选项设置为库名称(通常是 pkg-config
预期的低级名称)。例如,若要选择普通 libblas
和 liblapack
(这在 Linux 发行版上通常是 Netlib BLAS/LAPACK,可以在 conda-forge 上在实现中动态切换),请使用
$ # 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
只要安装时支持 pkg-config
(否则仍可检测到,但本性还是比较脆弱)的,其他可行选项包括 openblas
、mkl
、accelerate
、atlas
和 blis
。
使用 pkg-config 在非标准位置检测库#
在底层工作时,BLAS 和 LAPACK 检测方式是:Meson 先尝试使用 pkg-config
找出指定的库,然后使用 CMake。如果你有的只是一个独立的共享库文件(例如 armpl_lp64.so
,位于 /a/random/path/lib/
),还有 /a/random/path/include/
中一个对应的头文件),那么你要做的是,写自己的 pkg-config 文件。该文件应具有匹配的名称(所以在这个示例中,armpl_lp64.pc
),且可以放置在任意位置。应将 PKG_CONFIG_PATH
环境变量设置为指向 .pc
文件的位置。该文件的内容应该为:
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}
要检查是否按预期工作,你应能够运行
$ pkg-config --libs armpl_lp64
-L/path/to/library-dir -larmpl_lp64
$ pkg-config --cflags armpl_lp64
-I/path/to/include-dir