科学计算过程中经常会用到线性代数运算,尤其是矩阵乘法,自己手写的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
在Visual Studio下配置Intel MKL:详见 http://blog.youkuaiyun.com/zhujiahui622/article/details/50504164
在Visual Studio下配置Eigen。假设Eigen解压在D:\Local\eigen下,则在项目属性中的“配置属性”下的“C/C++”面板中将“附加包含目录”设置为D:\Local\eigen
写代码
#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秒。果然还是无法超越,只是差不多能赶上它了