分享

Visual Studio下实现Eigen+Intel MKL的矩阵乘法

 imelee 2017-09-22

科学计算过程中经常会用到线性代数运算,尤其是矩阵乘法,自己手写的C++代码想要赶上MATLAB几乎是不可能的。在C++中,谈到高性能计算就往往要用Intel MKL,但是用过的人都知道,这东西烦人的很,函数风格也怪异,不好用,一个简单的矩阵乘法函数dgemm的参数列表就老长老长。Eigen是一个相对来说十分优雅和好用的线性代数运算库(尤其是在Windows下,Blas,Lapack太麻烦,基本不考虑),缺点就是密集型计算“不那么快”。

所以,如果既能有Intel MKL的速度,又能有Eigen的优雅,还是在Windows下,那真真是极好的。

操作系统:Windows 7 64位

安装Visual Studio 2013
下载C++下的一个线性代数运算库Eigen并解压:http://eigen./index.php?title=Main_Page
安装Intel Parallel Studio XE 2015

  1. 在Visual Studio下配置Intel MKL:详见 http://blog.csdn.net/zhujiahui622/article/details/50504164

  2. 在Visual Studio下配置Eigen。假设Eigen解压在D:\Local\eigen下,则在项目属性中的“配置属性”下的“C/C++”面板中将“附加包含目录”设置为D:\Local\eigen
    这里写图片描述

  3. 写代码

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

// 使用Eigen+Intel MKL
int main(int argc, char *argv[])
{
    MatrixXd a = MatrixXd::Random(3000, 3000);  // 随机初始化矩阵
    MatrixXd b = MatrixXd::Random(3000, 3000);

    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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

“#define EIGEN_USE_MKL_ALL”这句宏定义就表示在Eigen上用了Intel MKL进行计算优化,当然,其他头文件也是不能少的。

“#define EIGEN_VECTORIZE_SSE4_2”这句表示采用SSE4.2浮点数优化,不用也可。

选择“Release”,“x64”模式进行生成(编译)
这里写图片描述

计算两个3000*3000的double型密集矩阵相乘
使用Eigen+Intel MKL的运行时间:0.736秒!!!已经相当快了
这里写图片描述

不用Intel MKL,只用Eigen,运行时间:4.28秒
这里写图片描述

MATLAB下运行时间:0.6788秒。果然还是无法超越,只是差不多能赶上它了
这里写图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多