• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Eigen库下使用MKL加速

武飞扬头像
XuanJ.Liu
帮助1

对于矩阵运算,Eigen库要比MKL库使用起来更加简洁明了,但是Eigen库的效率要远远比不上MKL库的速度,因此我们要在使用Eigen库函数中,使用MKL进行加速。

1. 下载Eigen库

Eigen库的配置很简单,网上有很多教程可供参考,这里我也会按部就班地说一下。

首先,要从Eigen的官网上进行下载安装。

下载地址:https://eigen.tuxfamily.org/index.php?title=Main_Page

学新通

这里我选择最新版 Eigen 3.4.0zip下载

打开安装包,我下载到电脑:D:\LXJ\安装包\eigen-3.4.0.zip\eigen-3.4.0

学新通

我们这里只需要用到Eigen库,所以可以直接把整个 Eigen 文件拷贝出来,粘到你想要创建库的文件夹中,方便你打包处理。

我拷贝到:D:\LXJ\LXJ_CODE\Eigen MKL\属性表\Eigen_lib,显示

学新通

到这里Eigen库的位置就放好了。

2. 配置Eigen库

首先,打开 VS2022,创建一个 .cpp 文件,测试用的。

  1.  
    #include<iostream>
  2.  
    #include<Eigen/Dense>
  3.  
     
  4.  
    using namespace Eigen;
  5.  
     
  6.  
    int main()
  7.  
    {
  8.  
    MatrixXd m = MatrixXd::Random(3, 3);
  9.  
    m = (m MatrixXd::Constant(3, 3, 1.2)) * 50;
  10.  
    std::cout << " m = " << std::endl << m << std::endl;
  11.  
    VectorXd v(3);
  12.  
    v << 1, 2, 3;
  13.  
    std::cout << " m * v = " << std::endl << m * v << std::endl;
  14.  
    }

这里我们选择 Debug x64,打开属性管理器

学新通

添加新项目属性表,我这里起名叫 Eigen_3.4.0

学新通

打开 Eigen_3.4.0

只需要把之前 Eigen所存在的路径放到包含目录里即可

学新通

到这里安装成功,运行显示

学新通

3. Eigen下使用MKL库加速

MKL 库的配置详看:https://blog.csdn.net/m0_63111108/article/details/124734432?spm=1001.2014.3001.5501

这里举一个很简单的例子来测试MKL的加速效果。

没有MKL加速:

  1.  
    #include <iostream>
  2.  
    #include <Eigen/Core>
  3.  
    #include <Eigen/Dense>
  4.  
    #include <time.h>
  5.  
     
  6.  
    using namespace std;
  7.  
    using namespace Eigen;
  8.  
     
  9.  
    int main(int argc, char* argv[])
  10.  
    {
  11.  
    MatrixXd a = MatrixXd::Random(1000, 1000); // 随机初始化矩阵
  12.  
    MatrixXd b = MatrixXd::Random(1000, 1000);
  13.  
     
  14.  
    double start = clock();
  15.  
    MatrixXd c = a * b;
  16.  
    double endd = clock();
  17.  
    double thisTime = (double)(endd - start) / CLOCKS_PER_SEC;
  18.  
     
  19.  
    cout << thisTime << endl;
  20.  
     
  21.  
    system("PAUSE");
  22.  
    return 0;
  23.  
    }
学新通

 学新通

有MKL加速,需要在预处理前添加宏定义:

  1.  
    #define EIGEN_USE_MKL_ALL
  2.  
    #define EIGEN_VECTORIZE_SSE4_2
  3.  
     
  4.  
    #include <iostream>
  5.  
    #include <Eigen/Core>
  6.  
    #include <Eigen/Dense>
  7.  
    #include <time.h>
  8.  
     
  9.  
    using namespace std;
  10.  
    using namespace Eigen;
  11.  
     
  12.  
    int main(int argc, char* argv[])
  13.  
    {
  14.  
    MatrixXd a = MatrixXd::Random(1000, 1000); // 随机初始化矩阵
  15.  
    MatrixXd b = MatrixXd::Random(1000, 1000);
  16.  
     
  17.  
    double start = clock();
  18.  
    MatrixXd c = a * b;
  19.  
    double endd = clock();
  20.  
    double thisTime = (double)(endd - start) / CLOCKS_PER_SEC;
  21.  
     
  22.  
    cout << thisTime << endl;
  23.  
     
  24.  
    system("PAUSE");
  25.  
    return 0;
  26.  
    }
学新通

学新通

不断增加矩阵维数,得到:

矩阵维数 无加速 有加速
1000X1000 15.566 0.019
2000X2000 122.432 0.101
3000X3000 415.981 0.285
4000X4000 978.103 进程退出

发现,在使用MKL加速时,矩阵维数超过一定数值时,就会直接退出进程

学新通

调试之后发现:

学新通

学新通

此问题尚未解决,若有专业人士明白,可以评论区留言或私聊。

此问题是一旦矩阵维数超过4000就进程结束,调试中的异常找不到根源,文件位置也存在于系统之中了,但仍旧解决不了。我猜想可能是电脑配置(12th Gen Intel(R) Core(TM) i5-12400   2.50 GHz),具体原因还请各位专业人士指正。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggeace
系列文章
更多 icon
同类精品
更多 icon
继续加载