BLAS и LAPACK#
Выбор библиотек BLAS и LAPACK#
Выбор библиотек BLAS и LAPACK, отличных от OpenBLAS по умолчанию, реализован через Meson опции сборки. Например, для выбора простого libblas и liblapack (обычно это Netlib
BLAS/LAPACK в дистрибутивах Linux, и можно динамически переключаться между
реализациями на 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 и
accelerate.
Обратите внимание, что как Accelerate, так и scipy-openblas имеют флаги в dev.py
которые легче запомнить, поскольку они обычно используются для разработки:
$ python dev.py build --with-accelerate
$ python dev.py build --with-scipy-openblas
The -Dlapack флаг не требуется для Accelerate, MKL или scipy-openblas, поскольку мы можем быть уверены, что BLAS и LAPACK одинаковы для этих опций. Например, чтобы создать wheel с Accelerate (только на macOS >=13.3), используйте:
$ python -m build -Csetup-args=-Dblas=accelerate
Использование pkg-config для обнаружения библиотек в нестандартном расположении#
Принцип обнаружения BLAS и LAPACK под капотом заключается в том, что Meson пытается
обнаружить указанные библиотеки сначала с помощью pkg-config, а затем с CMake. Если у вас есть только отдельный файл общей библиотеки (например,
armpl_lp64.so в /a/random/path/lib/ и соответствующий заголовочный файл в /a/random/path/include/), то вам нужно создать собственный файл pkg-config. Он должен иметь соответствующее имя (так что в этом примере, armpl_lp64.pc) и может находиться где угодно. The
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
Указание используемого ABI Fortran#
Некоторые библиотеки линейной алгебры построены с g77 ABI (также известный как «the» f2c соглашение о вызовах) и другие с ABI GFortran, и эти два
ABI несовместимы. Поэтому, если вы собираете SciPy с gfortran и связывается с библиотекой линейной алгебры, такой как MKL, которая собрана с g77 ABI,
будет исключение или segfault. SciPy исправляет это, используя обёртки ABI,
которые полагаются на API CBLAS для нескольких функций в API BLAS, страдающих
от этой проблемы.
#4756 g77 ABI) и если да,
использовать API CBLAS вместо API BLAS. Если автоопределение не удаётся или если
пользователь хочет переопределить этот механизм автоопределения для сборки против простого
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 с предоставленным пользователем порядком приоритета