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 с предоставленным пользователем порядком приоритета