本征 EIGEN_USE_MKL_ALL

Eigen with EIGEN_USE_MKL_ALL

我使用 EIGEN_USE_BLAS 选项编译了我的 C++ 项目(使用 Eigen 3.2.8)并针对 MKL-BLAS link,一切正常并且确实大大加快了我的程序(也许由于大量的复值矩阵向量乘法)

然后我也试了EIGEN_USE_MKL_ALL,但是,提示了一些类似的错误:

/eigen3/Eigen/src/QR/ColPivHouseholderQR_MKL.h:94:1 error:
Cannot convert "Eigen::PlainObjectBase<Eigen::matrix<int,-1,1>>::Scalar*
{aka int*}" to "long long int*" in initialization
EIGEN_MKL_OR_COLPIV(...) 

这里有两个问题:

  1. EIGEN_USE_BLAS 实现了 4 倍的加速,虽然我没想到那么多,可能的原因?

  2. EIGEN_USE_MKL_ALL好像和LAPACK的东西有类型冲突,如何解决编译错误?

  1. MKL 使用新的 AVX/AVX2 instruction set (8 32-bit float operations per clock with FMA and 3-operand instructions), while Eigen 3.2.8 only supports up to SSE4(每个时钟 4 个 32 位 float 操作)。正如 ggael 所指出的,您可以更新到 3.3beta1 以获得更好的性能。

  2. 您可以试试 Eigen 3.3-beta1。目前我无法重现您的问题。您可能需要提供您的代码示例和编译选项。但是根据你的错误消息,我猜你正在使用 ILP64 接口,即 not supported by Eigen。您可以改用 LP64。

为了完成康师因的回答,Eigen 3.3支持AVX/FMA,因此可以达到类似的性能。您需要在启用 AVX 和 FMA 指令的情况下进行编译。例如 GCC、clang 或 ICC:-mavx -mfma.