使用来自Eigen的BLAS和LAPACK

时间:2017-04-10 16:10:54

标签: lapack blas eigen3

我已经用Eigen和实现了一段代码我希望Eigen使用BLAS和LAPACK。

我见过here,这是可能的,但我不知道如何或在哪里将这些值/指令放在代码中。

我必须预先指定价值EIGEN_USE_BLAS,但我不知道在哪里。

我已经看到Eigen的源代码包含了BLAS和LAPACK的代码,但我完全忽略它是默认使用它还是什么。我正在使用Eigen 3.3.3。

2 个答案:

答案 0 :(得分:0)

好吧,我找到了解决方案

.h文件中包含以下内容:

// includes to make Eigen use BLAS+LAPACK
#include <complex>

#define EIGEN_SUPERLU_SUPPORT
#define EIGEN_USE_BLAS
#define EIGEN_USE_LAPACKE

#define LAPACK_COMPLEX_CUSTOM
#define lapack_complex_float std::complex<float>
#define lapack_complex_double std::complex<double>

// includes to call Eigen
#include <Eigen/Sparse>
#include <Eigen/StdVector>

无论使用复杂矩阵,复杂包含都是必需的,因为LAPACK会要求您定义所谓的复杂类型。

答案 1 :(得分:0)

您无需将这些指令放在代码中,而是使用这些宏编译代码。例如:

LAPACK_FLAGS=('-D EIGEN_USE_LAPACKE=1 -lm -lblas -llapack -llapacke')
g++ --std=c++11 eigenSVD.cpp -o eigenSVD.cpp ${LAPACK_FLAGS[@]}

看看Eigen/SVD,如果您的代码是用EIGEN_USE_LAPACKE编译的,则会看到Eigen-lapacke接口,并且将包含lapacke头文件。

#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT)
#ifdef EIGEN_USE_MKL
#include "mkl_lapacke.h"
#else
#include "src/misc/lapacke.h"
#endif
#include "src/SVD/JacobiSVD_LAPACKE.h"
#endif