Открытая (легковесная) библиотека линейной алгебры для научных вычислений на C/C++/Cython.

Вопрос или проблема

В настоящее время я пишу проект на Cython и ищу библиотеку линейной алгебры, которую можно использовать без вызова объектов Python (=без GIL).

В идеале, я хочу, чтобы она компилировалась простым способом с помощью pip и файла setup.py. Из-за этого я хочу, чтобы библиотека устанавливалась без Makefile.

Один из вариантов — это библиотека с только несколькими файлами *.h и *.c, или еще лучше, один заголовочный файл. В этом случае мне следует включить файлы в мой проект и распространять их вместе с моим проектом. Более того, есть вероятность, что мне придется модифицировать коды и писать интерфейсы самостоятельно, что может вызвать проблемы с некоторыми лицензиями. После завершения разработки я не уверен, под какой лицензией буду выпускать программное обеспечение (скорее всего MIT, но у меня может не быть выбора), поэтому мне следует избегать GPL или других вирусных лицензий.

Другой вариант — это библиотека Cython, уже опубликованная в conda-forge, которая может напрямую манипулировать указателями или массивами C. Установка conda является достаточно переносимой для этой цели, но в идеале она должна компилироваться под как можно большее количество ОС и архитектур. По крайней мере, они должны поддерживать x86-64 linux. Я размышлял, будет ли достаточно просто установить пользовательские BLAS с помощью conda; я никогда не пробовал BLAS раньше, но это, кажется, очень хорошо определенный стандарт. Пока мне (или другим пользователям) не нужно запускать Makefile, это будет нормально.

Есть какие-либо рекомендации? Спасибо заранее!

Ответ или решение

Чтобы выбрать подходящую библиотеку для линейной алгебры, следует учитывать ваши требования: легкость, отсутствие необходимости в использовании объектов Python и совместимость с Cython. Рассмотрим несколько хорошо зарекомендовавших себя опций:

  1. Eigen:
    Eigen — это высококачественная библиотека для работы с линейной алгеброй, написанная на C++. Она распространяется под лицензией MPL2, что делает ее совместимой с открытым и проприетарным программным обеспечением. Eigen — это библиотека-для-включения (header-only), что обозначает отсутствие необходимости в компиляции и повышает простоту интеграции в ваш проект. Она поддерживает широкий спектр архитектур и операционных систем. Для использования с Cython можно создать C-интерфейс поверх Eigen, что позволит избежать использования GIL.

  2. BLIS:
    BLIS предлагает современный взгляд на BLAS, прост в адаптации и гибок. Лицензия BSD-3 сделает библиотеку легкой для интеграции с различными типами ПО, в том числе вона может быть выполнена без установки Makefile. Она доступна на conda, что дополнительно упрощает установку и распространение.

  3. OpenBLAS:
    Если вас интересует выполнение линейной алгебры с высокой производительностью, OpenBLAS может быть предпочтительным вариантом. Он предоставляет высокоэффективные реализации BLAS и LAPACK. Однако стоит заметить, что для его установки может потребоваться использование Makefile, но пакет в conda решает эту проблему.

  4. Armadillo:
    Armadillo — это библиотека высокоуровневой линейной алгебры для C++, построенная поверх BLAS и LAPACK для эффективного выполнения. Она поставляется под лицензией Apache 2.0 и может быть легка для интеграции с проектами Cython. Упрощение с помощью Cython позволяет манипулировать C-указателями без необходимости во взаимодействии с GIL.

Что касается установки, conda и pip предложат различные возможности интеграции в зависимости от организации вашего проекта. Если вам будет нужно включить поддержку определенной архитектуры, conda, вероятно, предоставит более универсальное решение.

Опираясь на вышеизложенные рекомендации, вы можете выбрать библиотеку, которая наилучшим образом удовлетворяет вашим требованиям, и избежать проблем, связанных с лицензированием, используя фреймворки, предлагающие гибкие лицензии, такие как BSD или Apache. Не забудьте проверить совместимость с архитектурами и вашими специфическими потребностями, включая стремление минимизировать зависимость от объектов Python.

Оцените материал
Добавить комментарий

Капча загружается...