BLAS 和 LAPACK#
BLAS 和 LAPACK 选择的默认行为#
当调用 NumPy 构建时,BLAS 和 LAPACK 库的检测会自动发生.构建系统将尝试定位合适的库,并按一定顺序尝试许多已知的库——从最到最不高效.典型的顺序是:MKL、Accelerate、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
构建选项默认设置为”auto”,这意味着尝试所有已知的库.如果你想使用特定的库,可以将这些构建选项设置为库名称(通常是 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.如果你只有一个独立的共享库文件(例如,``/a/random/path/lib/`` 中的 armpl_lp64.so
和 /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