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

article/2025/9/14 6:23:33

文档总目录

本文目录

    • 在BLAS/LAPACK使用 Eigen
    • 在英特尔® MKL使用 Eigen
      • 链接
    • 在 CUDA 内核中使用 Eigen

在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_STRICTEIGEN_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_STRICTEIGEN_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是密集的向量。

链接

  • Intel MKL可以在这里购买和下载。
  • Intel MKL还捆绑在Intel Composer XE中。

在 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

http://chatgpt.dhexx.cn/article/3tdDiPmf.shtml

相关文章

Intel® MKL-DNN

Intel MKL-DNN 在现代英特尔架构中&#xff0c;缓存和内存使用效率会对整体性能产生显著影响。良好的内存访问模式可以最大限度地降低访问内存数据的额外成本&#xff0c;不会降低整体处理速度。若要实现这一目标&#xff0c;数据的存储和访问方式起着重要作用。这通常被称为数…

MKL学习——向量操作

前言 推荐两个比较好的教程: BLAS (Basic Linear Algebra Subprograms) LAPACK for Windows 命名规范 BLAS基本线性代数子程序的函数命令都有一定规范&#xff0c;便于记忆 <character> <name> <mod> () character 定义的是数据类型 s实数域&#…

mkl简介

一、概况 &#xff08;一&#xff09;下载 下载免费版本&#xff0c;注意保留serial number&#xff08;安装需要&#xff09; &#xff08;二&#xff09;安装 编辑silent.cfg 文件中的选项安装需要2G的空间&#xff0c;默认的tmp空间不足使用**–tmp_dir**指定 ./instal…

如何解决kaldi的依赖库mkl安装失败的问题

最近在学习如何使用kaldi进行语音识别。按照进程进行安装部署时发现Intel MKL库总是失败。 通过搜索大量的资料&#xff0c;但都发现不太适用。现在将失败的症状和解决方法分享一下&#xff0c;希望能给读者提供一些帮助。 通过执行 ./check_dependencies.sh 发现缺少Intel M…

oneKey mkl安装

1、oneKey mkl核心安装 进入官方下载地址&#xff0c;采用离线安装方式 1&#xff09;选择离线安装 2&#xff09;可以直接点击“download”下载安装包后再解压安装&#xff08;此种方式需要注册帐号&#xff0c;比较麻烦&#xff0c;介意选择下面的命令行安装&#xff09; …

Linux下MKL库的安装部署与使用,并利用cmake编译器调用MKL库去提升eigen库的计算速度

文章目录 前言一、MKL库的下载二、MKL库的安装与配置1.MKL库的安装与配置2.代码测试 总结 前言 在用C/C编写模型预测控制算法(MPC)的代码时候&#xff0c;由于预测步长和控制步长的设置较大&#xff0c;导致在利用eigen库进行矩阵计算的时候&#xff0c;矩阵n次幂计算时间过长&…

mysql 报1055错误_MySQL数据库报1055错误

有点坑啊&#xff0c;当初装MySQL数据库的时候没有整配置文件&#xff0c;结果MySQL报1055错误的时候&#xff0c;网上的解决办法都说如果需要永久生效的话&#xff0c;只能通过改配置文件实现&#xff0c;but&#xff0c;我没有配置文件&#xff0c;蜜汁尴尬啊 1、已安装的MyS…

mysql运行sql错误1055_sql数据库执行错误代码1055怎么解决?

展开全部 错误代码1055。不过看了Expression里面的原因描述,我基本知道怎么回事了。原因是因为62616964757a686964616fe59b9ee7ad9431333431373139mysql中对 group by 用法的规定。严格意义上说,就是group by之后。select 的字段只能是group by的字段。或者需要加聚合函数的。…

FOJ 1055

一&#xff0c;题目链接 http://acm.fzu.edu.cn/problem.php?pid1055 二&#xff0c;题目描述 三&#xff0c;题目分析 1.程序段的格式是已知的&#xff0c;一行为三个字符&#xff0c;且中间是赋值运算符&#xff0c;只需用一个数组记录字符是否 是已知的&#xff08;查表法…

MYSQL数据库报错 1055

MYSQL数据库报错 1055 今天在做毕业设计&#xff0c;当点开要查看的视图的时候&#xff0c;爆出了1055的错&#xff0c;该错误如下&#xff1a; 错误原因&#xff1a;在MySQL5.7之后&#xff0c;sql_mode中默认存在ONLY_FULL_GROUP_BY&#xff0c;SQL语句未通过ONLY_FULL_GRO…

leetcode1055

暴力查询即可&#xff0c;外面一层遍历target字符串&#xff0c;内层对source进行遍历&#xff0c;直到当前的内层遍历source中已无可匹配字符&#xff0c;在进行下一次source遍历&#xff0c;直到外层遍历结束。最终统计进行了几次内层遍历。 优化的方法&#xff1a;将内层遍历…

Mysql报错1055

Mysql group by报错 1055 [Err] 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘xm_xhd.al.dy_uid’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_…

MySQL 报错1055

一、问题描述 SELECT * FROM tbluser GROUP BY sex当我以这条语句进行数据库查询的时候&#xff0c;报了个错&#xff1a; > 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ceb.tbluser.uid which is not functiona…

mac mysql 1055_MySQL错误1055

问题描述:在MySQL数据库下,执行SQL插入语句报错。错误信息如下: 错误原因:在MySQL5.7之后,sql_mode中默认存在ONLY_FULL_GROUP_BY,SQL语句未通过ONLY_FULL_GROUP_BY语义检查所以报错。 ONLY_FULL_GROUP_BY:ONLY_FULL_GROUP_BY要求select语句中查询出来的列必须是明确的(…

MySQL 错误代码:1055 解决方案(推荐!!)

MySQL 错误代码:1055 解决办法 一、 MySQL版本二、 问题描述1. 问题描述2.ONLY_FULL_GROUP_BY-SQL示例 三、解决办法1.方法一2.方法二&#xff08;临时&#xff09;3.方法三&#xff08;永久&#xff09; 四、sql_mode常用值 一、 MySQL版本 MySQL版本&#xff1a;8.0.11 二、…

MySQL 出现1055错误 this is incompatible with sql mode=only full group by 的解决办法

文章目录 一、打开MySQL8.0 Command Line Client二、找到MySQL的my.ini文件路径三、修改my.ini里面的内容 前言 在学习过程中出现的问题&#xff1a;IDEA与Navicat出现不兼容的情况 会弹出1055的错误&#xff0c;这种错误通常在mysql 5.7以上的版本才会出现 1055 Expression #…

MySQL查询出现1055错误的解决方法

当SQL语句查询报1055错误时的解决方法 报错内容如下 报错原因 1.SQL语句中使用了group by&#xff0c;并且不需要分组的字段没有加上any_value()函数 2.MySQL数据库版本是大于5.7&#xff0c;报错信息中最后有一句sql_modeONLY_FULL_GROUP_BY&#xff0c;是因为MySQL数据库的…

1055 习题4-9-3 逆序输出正整数各位上数字

题目描述 输入一个不多于5位的正整数&#xff0c;按逆序输出各位上的数字&#xff0c;末尾换行。 注意&#xff1a;确保输入的正整数的位数不多于5。 输入 一个不多于5位的正整数。 输出 逆序输出各位上的数字&#xff0c;中间以空格分隔。 注意末尾的换行。 样例输入 2143 样…

IDEA破解后老是出现agent弹窗问题

第一步&#xff1a;在1这个路径下早到2这个文件 2.用解压软件提取2这个文件META-INF里面的important.txt放到上面1这个目录下&#xff08;这里使用的是7z解压&#xff09;

Intellij IDEA 破解方法和地址

IntelliJ IDEA是来自捷克的Jetbrains公司开发的Java开发工具(完爆Eclipse/MyEclipse)。有旗舰版和社区版两大版本&#xff0c;相对社区版而言旗舰版的功能更加丰富。官网提供了两个版本之间差异的详细比较。擅长企业级应用、移动应用以及Web应用开发。 支持MacOS,Windows7,Lin…