BLAS 和 LAPACK#

BLAS 和 LAPACK 選擇的預設行為#

當調用 NumPy 建置時,BLAS 和 LAPACK 函式庫偵測會自動發生。建置系統將嘗試找到合適的函式庫,並按照效能從高到低的順序嘗試一些已知的函式庫。典型的順序是:MKL、Accelerate、OpenBLAS、FlexiBLAS、BLIS、純 libblas/liblapack。這可能因平台或版本而異。該順序以及嘗試哪些函式庫可以通過 blas-orderlapack-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

預設情況下,將使用 BLAS 和 LAPACK 的 LP64 (32 位元整數) 介面。對於針對 ILP64 (64 位元整數) 介面進行建置,必須使用 use-ilp64 建置選項

$ python -m pip install . -Csetup-args=-Duse-ilp64=true

選擇特定的 BLAS 和 LAPACK 函式庫#

blaslapack 建置選項預設設定為 “auto”,這表示嘗試所有已知的函式庫。如果您想使用特定的函式庫,您可以將這些建置選項設定為函式庫名稱(通常是 pkg-config 預期的的小寫名稱)。例如,要選擇純 libblasliblapack(這通常是 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 支援;否則它們可能仍然被偵測到,但事情本質上更脆弱)包括 openblasmklaccelerateatlasblis

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