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

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

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

操作系统:Windows 7 64位

安装Visual Studio 2013
下载C++下的一个线性代数运算库Eigen并解压:http://eigen.tuxfamily.org/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;
}

“#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秒。果然还是无法超越,只是差不多能赶上它了
这里写图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值