Использование 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
и затем использовать следующие флаги линковки:-frameworkAccelerate/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_LAPACKEEIGEN_USE_LAPACKE_STRICT |
v1 = m1.lu().solve(v2); |
?getrf |
Разложение ХолецкогоEIGEN_USE_LAPACKEEIGEN_USE_LAPACKE_STRICT |
v1 = m2.selfadjointView<Upper>().llt().solve(v2); |
?potrf |
QR-разложениеEIGEN_USE_LAPACKEEIGEN_USE_LAPACKE_STRICT |
m1.householderQr(); m1.colPivHouseholderQr(); |
?geqrf ?geqp3 |
Разложение по сингулярным значениямEIGEN_USE_LAPACKE |
JacobiSVD<MatrixXd> svd; svd.compute(m1, ComputeThinV); |
?gesvd |
Разложения собственных значенийEIGEN_USE_LAPACKEEIGEN_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_LAPACKEEIGEN_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