【问题标题】:Use BLAS and LAPACK from Eigen使用 Eigen 的 BLAS 和 LAPACK
【发布时间】:2017-04-10 16:10:53
【问题描述】:

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

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

我必须在某个地方指定 EIGEN_USE_BLAS 的值,但我不知道在哪里。

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

【问题讨论】:

    标签: lapack blas eigen3


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      嗯,我找到了解决办法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        相关资源
        最近更新 更多