BLAS 和 LAPACK#
选择 BLAS 和 LAPACK 库#
除了 OpenBLAS 默认值之外,BLAS 和 LAPACK 库选择是通过 Meson 构建选项 实现的。例如,要选择普通的 libblas
和 liblapack
(这通常是 Linux 发行版上的 Netlib BLAS/LAPACK,并且可以在 conda-forge 上动态地在实现之间切换),请使用
$ # for a development build
$ python dev.py 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/scipy*.whl
$ # Or, with pip>=23.1, this works too:
$ python -m pip -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack
其他应该有效的选项(只要它们与 pkg-config
或 CMake 支持一起安装)包括 mkl
、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
指定要使用的 Fortran ABI#
一些线性代数库是用 g77
ABI(也称为“f2c
调用约定”)构建的,而另一些则是用 GFortran ABI 构建的,这两个 ABI 不兼容。因此,如果您用 gfortran
构建 SciPy 并链接到像 MKL 这样的线性代数库,该库是用 g77
ABI 构建的,就会出现异常或段错误。SciPy 通过使用 ABI 包装器来解决这个问题,这些包装器依赖于 CBLAS API 来完成 BLAS API 中受此问题影响的少数几个函数。
请注意,SciPy 需要在构建时知道需要做什么,构建系统将自动检查线性代数库是否是 MKL 或 Accelerate(它们都始终使用 g77
ABI),如果是,则使用 CBLAS API 而不是 BLAS API。如果自动检测失败,或者用户想要覆盖此自动检测机制以针对普通的 libblas
/liblapack
进行构建(例如,这就是 conda-forge 所做的),请使用 -Duse-g77-abi=true
构建选项。例如,
$ python -m build -C-Duse-g77-abi=true -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack
正在开发中#
这些选项计划全面支持,但目前无法开箱即用。
ILP64(64 位整数大小)构建:SciPy 的很大一部分支持使用 ILP64 BLAS/LAPACK。请注意,支持仍然不完整,因此 SciPy 也需要 LP64(32 位整数大小)BLAS/LAPACK。
从多个可能的 BLAS 和 LAPACK 选项中自动选择,并指定用户提供的优先级顺序