BLAS 和 LAPACK#

選擇 BLAS 和 LAPACK 函式庫#

除了預設的 OpenBLAS 之外,BLAS 和 LAPACK 函式庫的選擇是透過 Meson 建置選項 實作的。例如,要選擇純 libblasliblapack(這通常是 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 支援)包括 mklatlasblisaccelerate

請注意,Accelerate 和 scipy-openblasdev.py 中都有更容易記住的旗標,因為它們常用於開發

$ python dev.py build --with-accelerate
$ python dev.py build --with-scipy-openblas

對於 Accelerate、MKL 或 scipy-openblas,不需要 -Dlapack 旗標,因為我們可以確定這些選項的 BLAS 和 LAPACK 是相同的。例如,要使用 Accelerate 建立 wheel 檔案(僅限於 macOS >=13.3),請使用

$ python -m build -Csetup-args=-Dblas=accelerate

使用 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 這樣的線性代數函式庫(它是以 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

工作中 (Work-in-progress)#

這些選項計劃完全支援,但目前尚無法直接使用

  • ILP64(64 位元整數大小)建置:SciPy 的大部分支援使用 ILP64 BLAS/LAPACK。請注意,支援仍然不完整,因此 SciPy *也* 需要 LP64(32 位元整數大小)BLAS/LAPACK。

  • 自動從多個可能的 BLAS 和 LAPACK 選項中選擇,並提供使用者指定的優先順序