BLAS и LAPACK#

Поведение по умолчанию для выбора BLAS и LAPACK#

При сборке NumPy обнаружение библиотек BLAS и LAPACK происходит автоматически. Система сборки попытается найти подходящую библиотеку, и проверит ряд известных библиотек в определённом порядке — от наиболее производительных к наименее. Типичный порядок: MKL, Accelerate, OpenBLAS, FlexiBLAS, BLIS, plain libblas/liblapack. Это может различаться в зависимости от платформы или выпусков. Этот порядок и то, какие библиотеки пробуются, можно изменить через blas-order и lapack-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

По умолчанию будет использоваться интерфейс LP64 (32-битное целое число) к BLAS и LAPACK. Для сборки с интерфейсом ILP64 (64-битное целое число) необходимо использовать use-ilp64 опция сборки:

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

Выбор конкретных библиотек BLAS и LAPACK#

The blas и lapack опции сборки установлены в "auto" по умолчанию, что означает попытку использовать все известные библиотеки. Если вы хотите использовать конкретную библиотеку, вы можете установить эти опции сборки в имя библиотеки (обычно имя в нижнем регистре, которое pkg-config ожидает). Например, чтобы выбрать простой libblas и liblapack (это обычно Netlib BLAS/LAPACK в дистрибутивах Linux, и может динамически переключаться между реализациями на 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 поддержка; в противном случае они все еще могут быть обнаружены, но вещи по своей природе более хрупкие) включают openblas, mkl, accelerate, atlas и blis.

Использование 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