使用Eigen中的BLAS和LAPACK

9
我使用Eigen实现了一段代码,我希望Eigen使用BLAS和LAPACK。 我在这里看到了可能的方法,但我不知道在代码中如何设置这些值/指令。
我必须在某个地方指定EIGEN_USE_BLAS值,但是我不知道应该在哪里设置。
我看到Eigen的源代码包含BLAS和LAPACK的代码,但我不确定它是否默认使用它。我正在使用Eigen 3.3.3。
2个回答

5
您不需要在代码中添加这些指令,而是使用这些宏编译您的代码。例如:
LAPACK_FLAGS=('-D EIGEN_USE_LAPACKE=1 -lm -lblas -llapack -llapacke')
g++ --std=c++11 eigenSVD.cpp -o eigenSVD.cpp ${LAPACK_FLAGS[@]}

如果您的代码使用 EIGEN_USE_LAPACKE 编译,可以查看 Eigen/SVD。这样,您将会看到 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

1

好的,我已经找到了解决方案

在你的.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要求您定义所谓的复杂类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接