Spec-Zone.ru › Eigen3

Использование BLAS/LAPACK из Eigen

Начиная с версии Eigen 3.3 и более поздних, любые совместимые с F77 библиотеки BLAS или LAPACK могут использоваться в качестве бэкендов для операций с плотными матрицами и разложениями плотных матриц. Например, можно использовать Intel® MKL, фреймворк Apple Accelerate на OSX, OpenBLAS, Netlib LAPACK и т.д.

Не пропустите эту страницу для дальнейшего обсуждения использования Intel® MKL (также включает VML, PARDISO и т.д.).

Для использования внешней библиотеки BLAS и/или LAPACK необходимо связать собственное приложение с соответствующими библиотеками и их зависимостями. Для LAPACK необходимо также связаться со стандартной библиотекой Lapacke, которая используется в качестве удобного слоя между кодом Eigen на C++ и интерфейсом LAPACK F77. Затем необходимо активировать их использование, определив одну или несколько следующих макросов (до включения заголовков Eigen):

Примечание
Для пользователей Mac, для использования версии lapack, поставляемой с фреймворком Accelerate, также требуется библиотека lapacke. С помощью MacPorts это так же просто, как:
sudo port install lapack
и затем использовать следующие флаги линковки: -framework Accelerate /opt/local/lib/lapack/liblapacke.dylib
EIGEN_USE_BLAS Включает использование внешних подпрограмм BLAS уровня 2 и 3 (совместимых с любым F77 интерфейсом BLAS)
EIGEN_USE_LAPACKE Включает использование внешних подпрограмм Lapack через C-интерфейс Lapacke для Lapack (совместимых с любым F77 интерфейсом LAPACK)
EIGEN_USE_LAPACKE_STRICT То же, что и EIGEN_USE_LAPACKE, но алгоритмы с меньшей численной устойчивостью отключены.
В настоящее время это касается только JacobiSVD, которое в противном случае было бы заменено на gesvd, которое менее устойчиво, чем вращения Якоби.

При этом ряд алгоритмов Eigen молча заменяется вызовами подпрограмм BLAS или LAPACK. Эти замены применяются только для динамических или достаточно больших объектов с одним из следующих четырех стандартных типов скаляров: float, double, complex<float>, и complex<double>. Операции с другими типами скаляров или смешивание вещественных и комплексных чисел будут продолжать использовать встроенные алгоритмы.

Перечень функциональности Eigen, который может быть заменён, представлен в таблице ниже.

Функциональная область Пример кода Подпрограммы BLAS/LAPACK
Операции с матрицами
EIGEN_USE_BLAS
m1*m2.transpose();
m1.selfadjointView<Lower>()*m2;
m1*m2.triangularView<Upper>();
m1.selfadjointView<Lower>().rankUpdate(m2,1.0);
?gemm
?symm/?hemm
?trmm
dsyrk/ssyrk
Операции с матрицами и векторами
EIGEN_USE_BLAS
m1.adjoint()*b;
m1.selfadjointView<Lower>()*b;
m1.triangularView<Upper>()*b;
?gemv
?symv/?hemv
?trmv
LU-разложение
EIGEN_USE_LAPACKE
EIGEN_USE_LAPACKE_STRICT
v1 = m1.lu().solve(v2);
?getrf
Разложение Холецкого
EIGEN_USE_LAPACKE
EIGEN_USE_LAPACKE_STRICT
v1 = m2.selfadjointView<Upper>().llt().solve(v2);
?potrf
QR-разложение
EIGEN_USE_LAPACKE
EIGEN_USE_LAPACKE_STRICT
m1.householderQr();
m1.colPivHouseholderQr();
?geqrf
?geqp3
Разложение по сингулярным значениям
EIGEN_USE_LAPACKE
JacobiSVD<MatrixXd> svd;
svd.compute(m1, ComputeThinV);
?gesvd
Разложения собственных значений
EIGEN_USE_LAPACKE
EIGEN_USE_LAPACKE_STRICT
EigenSolver<MatrixXd> es(m1);
ComplexEigenSolver<MatrixXcd> ces(m1);
SelfAdjointEigenSolver<MatrixXd> saes(m1+m1.transpose());
GeneralizedSelfAdjointEigenSolver<MatrixXd>
    gsaes(m1+m1.transpose(),m2+m2.transpose());
?gees
?gees
?syev/?heev
?syev/?heev,
?potrf
Разложение Шур
EIGEN_USE_LAPACKE
EIGEN_USE_LAPACKE_STRICT
RealSchur<MatrixXd> schurR(m1);
ComplexSchur<MatrixXcd> schurC(m1);
?gees

В примерах m1 и m2 — плотные матрицы, а v1 и v2 — плотные векторы.

© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/TopicUsingBlasLapack.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API