Eigen库下使用MKL加速

对于矩阵运算,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 文件,测试用的。

#include<iostream>
#include<Eigen/Dense>

using namespace Eigen;

int main()
{
	MatrixXd m = MatrixXd::Random(3, 3);
	m = (m + MatrixXd::Constant(3, 3, 1.2)) * 50;
	std::cout << " m = " << std::endl << m << std::endl;
	VectorXd v(3);
	v << 1, 2, 3;
	std::cout << " m * v = " << std::endl << m * v << std::endl;
}

这里我们选择 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加速:

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <time.h>

using namespace std;
using namespace Eigen;

int main(int argc, char* argv[])
{
    MatrixXd a = MatrixXd::Random(1000, 1000);  // 随机初始化矩阵
    MatrixXd b = MatrixXd::Random(1000, 1000);

    double start = clock();
    MatrixXd c = a * b;    
    double endd = clock();
    double thisTime = (double)(endd - start) / CLOCKS_PER_SEC;

    cout << thisTime << endl;

    system("PAUSE");
    return 0;
}

 

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

#define EIGEN_USE_MKL_ALL
#define EIGEN_VECTORIZE_SSE4_2

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <time.h>

using namespace std;
using namespace Eigen;

int main(int argc, char* argv[])
{
    MatrixXd a = MatrixXd::Random(1000, 1000);  // 随机初始化矩阵
    MatrixXd b = MatrixXd::Random(1000, 1000);

    double start = clock();
    MatrixXd c = a * b;    
    double endd = clock();
    double thisTime = (double)(endd - start) / CLOCKS_PER_SEC;

    cout << thisTime << endl;

    system("PAUSE");
    return 0;
}

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

矩阵维数无加速有加速
1000X100015.5660.019
2000X2000122.4320.101
3000X3000415.9810.285
4000X4000978.103进程退出

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

调试之后发现:

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

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

  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值