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 支持安装)包括 mklatlasblis

使用 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

指定要使用的 Fortran ABI#

一些线性代数库是基于 g77 ABI(也称为“f2c 调用约定”)构建的,而其他一些则是基于 GFortran ABI 构建的,这两种 ABI 是不兼容的。因此,如果你使用 gfortran 编译 SciPy 并链接到一个像 MKL 这样的线性代数库,而 MKL 是基于 g77 ABI 构建的,那么将会出现异常或段错误。SciPy 通过使用依赖于 CBLAS API 的 ABI 包装器来解决这个问题,这些包装器用于解决 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 选项中选择,用户提供优先顺序