lapacke.h в CentOS 5

Я пытаюсь создать колесо Python, которое использует расширения BLAS и LAPACK C. Компиляция такого пакета под Ubuntu требует следующих системных пакетов:

  • libopenblas-dev: (Открытые) библиотеки разработки BLAS
  • liblapack-dev: Библиотеки разработки LAPACK
  • liblapacke-dev: C заголовки для LAPACK

Это хорошо работает, но теперь мне нужно повторить процесс под CentOS 5. Причина в том, что я пытаюсь создать колесо manylinux, и рекомендуемый способ - использовать старый набор инструментов CentOS, чтобы гарантировать, что он будет работать в разных дистрибутивах Linux.,

Проблема в том, пока libopenblas-dev а также liblapack-dev имеют эквиваленты в CentOS 5 (openblas-devel а также lapack-devel), эквивалентного пакета для liblapacke-dev, Это имеет некоторый смысл, учитывая, что версия LAPACK, представленная в этих пакетах, очень старая (3.0), которая, похоже, не поддерживает lapacke. Но из-за этого я не могу скомпилировать свое программное обеспечение, так как gcc жалуется на отсутствие заголовков lapacke.h.

Вещи, которые я пробовал:

  • Загрузка и компиляция новой версии LAPACK вручную (3.8.0 и 3.6.0). Я получаю ошибки компиляции.
  • Непосредственное копирование заголовка lapacke.h из одной из версий LAPACK выше в /usr/include. Не работает, вероятно, из-за разницы в версиях LAPACK.
  • Добавление репозиториев Intel MKL в соответствии с официальными инструкциями и замена BLAS/LAPACK на MKL. К сожалению, CentOS 5 не включает --add-repo вариант в yum-config-managerтак что я немного растерялся.

1 ответ

Lapacke не поддерживается в CentOS 5.0, поэтому интерфейс C недоступен, но вы все равно можете сделать это, вызвав символы fortran.

Сначала установите пакеты CentOS для BLAS и LAPACK

yum install -y blas-devel lapack-devel

и добавьте эти библиотеки в путь компоновщика

export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/lib64"

Теперь вы должны иметь возможность использовать функции BLAS и LAPACK в своем коде расширений C/C++, импортируя символы фортрана. Например, чтобы использовать функцию LAPACK dpttrs в источнике C++ вам нужно будет объявить его как внешний символ C

extern "C" {
    void dpttrs_(lapack_int* n, lapack_int* nrhs, const double* d, const double* e, 
                 double* b, lapack_int* ldb, lapack_int *info );
}

а затем его можно использовать как обычно, вызывая dpttrs_ функция.

Наконец, при упаковке пакета python обязательно включите blas а также lapack библиотеки и заголовки. Например, при использовании cffi вы должны настроить свои источники в следующем порядке

ffi.set_source(
    'YOUR MODULE NAME',
    "BASE SOURCES",
    sources=sources,
    source_extension='.cpp',
    libraries=['blas', 'lapack'],
    include_dirs=['/usr/include']
)
Другие вопросы по тегам