BLAS und LAPACK#
Auswahl von BLAS- und LAPACK-Bibliotheken#
Die Auswahl von BLAS- und LAPACK-Bibliotheken, abgesehen vom OpenBLAS-Standard, wird über Meson Build-Optionen implementiert. Um beispielsweise reine libblas und liblapack auszuwählen (dies ist typischerweise Netlib BLAS/LAPACK auf Linux-Distributionen und kann auf conda-forge dynamisch zwischen Implementierungen umgeschaltet werden), verwenden Sie
$ # 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
Andere Optionen, die funktionieren sollten (solange sie mit pkg-config oder CMake-Unterstützung installiert sind), sind mkl, atlas, blis und accelerate.
Beachten Sie, dass sowohl Accelerate als auch scipy-openblas Flags in dev.py haben, die leichter zu merken sind, da sie häufig für die Entwicklung verwendet werden
$ python dev.py build --with-accelerate
$ python dev.py build --with-scipy-openblas
Das Flag -Dlapack wird für Accelerate, MKL oder scipy-openblas nicht benötigt, da wir sicher sein können, dass BLAS und LAPACK bei diesen Optionen identisch sind. Zum Beispiel, um ein Wheel mit Accelerate (nur auf macOS >=13.3) zu erstellen, verwenden Sie
$ python -m build -Csetup-args=-Dblas=accelerate
Verwendung von pkg-config zur Erkennung von Bibliotheken an einem nicht standardmäßigen Speicherort#
Die Art und Weise, wie BLAS- und LAPACK-Erkennung im Hintergrund funktioniert, ist, dass Meson versucht, die angegebenen Bibliotheken zuerst mit pkg-config und dann mit CMake zu finden. Wenn Sie nur eine eigenständige gemeinsam genutzte Bibliotheksdatei haben (z. B. armpl_lp64.so in /a/random/path/lib/ und eine entsprechende Header-Datei in /a/random/path/include/), dann müssen Sie Ihre eigene pkg-config-Datei erstellen. Sie sollte einen passenden Namen haben (also in diesem Beispiel armpl_lp64.pc) und kann überall liegen. Die Umgebungsvariable PKG_CONFIG_PATH sollte auf den Speicherort der .pc-Datei gesetzt werden. Der Inhalt dieser Datei sollte lauten:
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}
Um zu überprüfen, ob dies wie erwartet funktioniert, sollten Sie in der Lage sein auszuführen
$ pkg-config --libs armpl_lp64
-L/path/to/library-dir -larmpl_lp64
$ pkg-config --cflags armpl_lp64
-I/path/to/include-dir
Angabe der zu verwendenden Fortran ABI#
Einige lineare Algebra-Bibliotheken werden mit der g77 ABI (auch bekannt als „die f2c Aufrufkonvention“) und andere mit der GFortran ABI erstellt, und diese beiden ABIs sind inkompatibel. Wenn Sie also SciPy mit gfortran erstellen und mit einer linearen Algebra-Bibliothek wie MKL verknüpfen, die mit einer g77 ABI erstellt wurde, kommt es zu einer Ausnahme oder einem Segfault. SciPy behebt dies durch die Verwendung von ABI-Wrappern, die die CBLAS-API für die wenigen Funktionen in der BLAS-API verwenden, die von diesem Problem betroffen sind.
Beachten Sie, dass SciPy zur Build-Zeit wissen muss, was getan werden muss, und das Build-System automatisch prüft, ob die lineare Algebra-Bibliothek MKL oder Accelerate ist (die beide immer die g77 ABI verwenden) und wenn ja, die CBLAS-API anstelle der BLAS-API verwendet. Wenn die automatische Erkennung fehlschlägt oder wenn der Benutzer diesen automatischen Erkennungsmechanismus überschreiben möchte, um gegen reine libblas/liblapack zu erstellen (was conda-forge zum Beispiel tut), verwenden Sie die Build-Option -Duse-g77-abi=true. Zum Beispiel:
$ python -m build -C-Duse-g77-abi=true -Csetup-args=-Dblas=blas -Csetup-args=-Dlapack=lapack
Arbeit in Arbeit#
Diese Optionen sollen vollständig unterstützt werden, sind aber derzeit nicht out-of-the-box nutzbar
ILP64 (64-Bit-Integer-Größe) Builds: Große Teile von SciPy unterstützen die Verwendung von ILP64 BLAS/LAPACK. Beachten Sie, dass die Unterstützung noch unvollständig ist, sodass SciPy *auch* LP64 (32-Bit-Integer-Größe) BLAS/LAPACK benötigt.
Automatische Auswahl aus mehreren möglichen BLAS- und LAPACK-Optionen mit einer vom Benutzer angegebenen Reihenfolge der Priorität