[Eigen中文文档] 在 BLAS/LAPACK 、英特尔® MKL 和 CUDA 中使用 Eigen

简介: 自Eigen 3.3版本以及以后,任何F77兼容的BLAS或LAPACK库都可以用作稠密矩阵乘积和稠密矩阵分解的后端。例如,可以在OSX上使用Intel® MKL,Apple的Accelerate框架,OpenBLAS,Netlib LAPACK等。请务必查看此页面以进一步讨论关于使用Intel® MKL(也包括VML,PARDISO等)的具体用法。

文档总目录

在BLAS/LAPACK使用 Eigen

英文原文(Using BLAS/LAPACK from Eigen)

自Eigen 3.3版本以及以后,任何F77兼容的BLAS或LAPACK库都可以用作稠密矩阵乘积和稠密矩阵分解的后端。例如,可以在OSX上使用Intel® MKL,Apple的Accelerate框架,OpenBLAS,Netlib LAPACK等。

请务必查看此页面以进一步讨论关于使用Intel® MKL(也包括VML,PARDISO等)的具体用法。

为了使用外部BLAS和LAPACK库,您必须将自己的应用程序链接到相应的库及其依赖项。对于LAPACK,还必须链接到标准的Lapacke库,它用作Eigen的C++代码和LAPACK F77接口之间方便的中间层。然后,必须通过定义以下一个或多个宏(在包含任何Eigen头文件之前)来激活它们的使用:

注意:

对于Mac用户,为了使用与Accelerate框架一起提供的lapack版本,您还需要lapacke库。使用MacPorts很容易实现:

sudo port install lapack

然后使用以下链接标志:-framework Accelerate /opt/local/lib/lapack/liblapacke.dylib

描述
EIGEN_USE_BLAS 启用外部BLAS级别2和3例程的使用(与任何F77 BLAS接口兼容)。
EIGEN_USE_LAPACKE 启用通过Lapacke C接口到Lapack的外部Lapack例程的使用(与任何F77 LAPACK接口兼容)。
EIGEN_USE_LAPACKE_STRICT EIGEN_USE_LAPACKE相同,但数字鲁棒性较低的算法被禁用。
这目前仅涉及JacobiSVD,否则会被gesvd替换,后者比Jacobi旋转不太稳健。

在这种情况下,Eigen的一些算法会被隐式地替换为对BLAS或LAPACK例程的调用。这些替换仅适用于使用以下四种标准标量类型之一的动态或足够大的对象:floatdoublecomplex<float>complex<double>。对其他标量类型的操作或混合实数和复数的操作将继续使用内置的算法。

可以被替换的Eigen功能的广度如下表所示:

在这里插入图片描述

在这些例子中,m1m2是密集矩阵,v1v2是密集向量。

在英特尔® MKL使用 Eigen

英文原文(Using Intel® MKL from Eigen)

自Eigen 3.1版本及以后,用户可以使用Intel®Math Kernel Library(MKL)如果安装了Intel MKL 10.3(或更高版本)。

Intel MKL 提供了针对x86兼容架构高度优化的多线程数学例程。Intel MKL可在LinuxMacWindows上使用,适用于Intel64IA32架构。

注意:

Intel® MKL是专有软件,用户需要购买或注册社区(免费)Intel MKL许可证来使用它。此外,用户产品的许可证必须允许链接到专有软件,但不包括任何未经修改的GPL版本。

通过Eigen使用Intel MKL很容易:

  1. 在包含任何Eigen的头文件之前定义EIGEN_USE_MKL_ALL宏。
  2. 将你的程序链接到MKL库(请参阅MKL链接指南)。
  3. 在64位系统上,你必须使用LP64接口(而不是ILP64接口)。

在这样做时,一些Eigen的算法会被替换为调用Intel MKL例程,而这种替换仅适用于具有以下四种标准标量类型之一的动态或足够大的对象:floatdoublecomplex<float>complex<double>。使用其他标量类型或混合实数和复数的操作仍将使用内置的算法。

此外,您可以选择定义以下一个或多个宏来决定哪些部分将被替换:

描述
EIGEN_USE_BLAS 启用使用外部BLAS Level 2Level 3例程。
EIGEN_USE_LAPACKE 启用使用Lapacke C接口到Lapack的外部Lapack例程。
EIGEN_USE_LAPACKE_STRICT EIGEN_USE_LAPACKE相同,但将禁用鲁棒性较低的算法。这仅涉及到JacobiSVD,否则将被gesvd替换,后者比Jacobi旋转算法鲁棒性更低。
EIGEN_USE_MKL_VML 启用Intel VML(向量操作)的使用。
EIGEN_USE_MKL_ALL 定义了EIGEN_USE_BLASEIGEN_USE_LAPACKEEIGEN_USE_MKL_VML

EIGEN_USE_BLASEIGEN_USE_LAPACKE*宏可以与EIGEN_USE_MKL结合使用,以显式告诉Eigen底层的BLAS/Lapack实现是Intel MKL。主要效果是启用MKL直接调用功能(MKL_DIRECT_CALL)。这可能有助于提高某些MKL BLAS?GEMM?GEMV?TRSM?AXPY?DOT)和LAPACKLUCholeskyQR)例程对非常小的矩阵的性能。可以通过定义EIGEN_MKL_NO_DIRECT_CALL来禁用MKL直接调用。

请注意,BLASLAPACKE后端可用于任何F77兼容的BLASLAPACK库。有关详细信息,请参见 此页面

最后,Intel MKL附带的PARDISO稀疏求解器可以通过PardisoSupport模块的PardisoLUPardisoLLTPardisoLDLT类来使用。

下表总结了EIGEN_USE_MKL_VML覆盖的函数列表:

在这里插入图片描述

在这些例子中,v1v2是密集的向量。

链接

在 CUDA 内核中使用 Eigen

英文原文(Using Eigen in CUDA kernels)

CUDA 5.5Eigen 3.3开始,可以在CUDA核函数内使用Eigen的矩阵、向量和数组(fixed size)。这在处理众多但小型问题时特别有用。默认情况下,当在由nvcc编译的.cu文件中包含Eigen头文件时,大多数Eigen的函数和方法都会被设备主机关键字前缀,使它们可从主机和设备代码中调用。这种支持可以通过在包含任何Eigen头文件之前定义EIGEN_NO_CUDA来禁用。这在仅在主机端使用Eigen的.cu文件使用时可能有用。但是,在两种情况下,主机的SIMD矢量化必须在.cu文件中禁用。因此,强烈建议将所有昂贵的主机计算从.cu文件恰当地移动到常规的.cpp文件中。

已知问题:

  • nvccMS Visual Studio不兼容(欢迎提交补丁)。
  • nvcc 5.5gcc-4.7(或更高版本)使用标准库<limits>头文件有问题。为了解决这个问题,您可以在包含任何其他文件之前添加以下内容:
// workaround issue between gcc >= 4.7 and cuda 5.5
#if (defined __GNUC__) && (__GNUC__>4 || __GNUC_MINOR__>=7)
  #undef _GLIBCXX_ATOMIC_BUILTINS
  #undef _GLIBCXX_USE_INT128
#endif
  • 在64位系统上,Eigen默认使用长整型作为索引和大小的类型。在CUDA设备上,默认使用32位整型是有意义的。但是,为了使主机和CUDA代码兼容,Eigen不能自动完成此操作。因此,用户需要在整个代码中(如果没有通过Eigen对象在主机和CUDA代码之间进行交互,则仅在CUDA代码中)定义EIGEN_DEFAULT_DENSE_INDEX_TYPEint
相关文章
|
XML 并行计算 算法
[Eigen中文文档] 求解稀疏线性系统
在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示,必须特别小心以获得良好的性能。本文列出了Eigen中可用的稀疏求解器。还介绍了所有这些线性求解器共同的主要步骤。根据矩阵的属性、所需的准确度,最终用户可以调整这些步骤以提高其代码的性能。请注意,并不需要深入了解这些步骤背后的内容:最后一节介绍了一个基础例程,可轻松使用以获取所有可用求解器的性能洞察。
1004 0
|
缓存 测试技术 编译器
[Eigen中文文档] 稠密矩阵分解函数对比
本文介绍了 Eigen 为各种方阵和过约束问题提供的稠密矩阵分解的速度比较。
514 0
|
存储 编译器
[Eigen中文文档] 深入了解 Eigen - 类层次结构
本页面介绍了Eigen类层次结构中 Core 类的设计及其相互关系。一般用户可能不需要关注这些细节,但对于高级用户和Eigen开发人员可能会有用。
629 0
|
机器学习/深度学习 人工智能 算法
《C++与 Armadillo:线性代数助力人工智能算法简化之路》
线性代数是构建人工智能模型的基础,涉及矩阵乘法、特征分解等运算。C++作为高效编程语言,在AI开发中占据重要地位。Armadillo库为C++提供了强大的线性代数支持,具备高效性、易用性和丰富功能,简化了AI算法的实现。本文深入探讨如何利用Armadillo库优化线性代数运算,提高AI算法的开发效率和性能。
410 10
|
存储 算法 NoSQL
[Eigen中文文档] 稀疏矩阵操作
在许多应用中(例如,有限元方法),通常要处理非常大的矩阵,其中只有少数系数不为零。在这种情况下,可以通过使用仅存储非零系数的特殊表示来减少内存消耗并提高性能。这样的矩阵称为稀疏矩阵。
991 0
|
存储 缓存
[Eigen中文文档] 深入了解 Eigen - 惰性求值与混叠(Aliasing)
Eigen具有智能的编译时机制,可以实现惰性求值并在适当的情况下删除临时变量。它会自动处理大多数情况下的混叠问题,例如矩阵乘积。自动行为可以通过使用MatrixBase::eval()和MatrixBase::noalias()方法手动覆盖。
680 0
|
存储 并行计算 算法
[Eigen中文文档] 概述(总目录)
Eigen是基于线性代数的C ++模板库,主要用于矩阵,向量,数值求解器和相关算法。常用的Ceres、G2O等项目均是基于Eigen库。 本系列文章将通过官方文档带你了解Eigen。
3107 1
|
Linux Shell
Linux下,查看 可执行文件 依赖的 动态库的几个方法
Linux下,查看 可执行文件 依赖的 动态库的几个方法
3584 0
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
2376 5
|
存储 NoSQL API
[Eigen中文文档] Matrix类
在Eigen中,所有矩阵和向量都是Matrix模板类的对象。向量只是行数或者列数为1的特殊矩阵。
986 1