Eigen库下使用MKL加速

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

1. 下载Eigen库

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

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

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

Eigen库下使用MKL加速_第1张图片

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

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

Eigen库下使用MKL加速_第2张图片

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

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

Eigen库下使用MKL加速_第3张图片

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

2. 配置Eigen库

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

#include
#include

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库下使用MKL加速_第4张图片

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

Eigen库下使用MKL加速_第5张图片

打开 Eigen_3.4.0

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

Eigen库下使用MKL加速_第6张图片

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

Eigen库下使用MKL加速_第7张图片

3. Eigen下使用MKL库加速

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

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

没有MKL加速:

#include 
#include 
#include 
#include 

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;
}

 Eigen库下使用MKL加速_第8张图片

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

#define EIGEN_USE_MKL_ALL
#define EIGEN_VECTORIZE_SSE4_2

#include 
#include 
#include 
#include 

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;
}

Eigen库下使用MKL加速_第9张图片

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

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

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

Eigen库下使用MKL加速_第10张图片

调试之后发现:

Eigen库下使用MKL加速_第11张图片

Eigen库下使用MKL加速_第12张图片

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

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

你可能感兴趣的:(计算机,c++,开发语言,visual,studio)