如何使用针对matlab的特征库来加速这个C ++程序?

时间:2014-06-18 22:42:02

标签: c++ matlab eigen

我想用C ++进行大线性代数计算。作为开始步骤,我在C ++和matlab中创建了这些比较程序。我也在这里给出惊人的执行时间。你能否建议击败matlab或至少获得可比性能?我知道C ++使用高度向量化的方法进行计算。那么在涉及线性代数的大型科学编程中,是否应该总是使用matlab而不是C ++?我个人认为matlab没有为大型计算提供良好的性能,因此在这种情况下C ++比matlab更受欢迎。然而,我的计划结果却违背了这一信念。

使用gcc:

编译的C ++程序
#include <iostream>
#include <Eigen\Dense> //EIGEN library

using namespace Eigen;
using namespace std;

int main()
{
MatrixXd A;
A.setRandom(1000, 1000);

MatrixXd B;
B.setRandom(1000, 1000);

MatrixXd C;
C=A*B;
}

执行时间:24.141秒

这是matlab程序:

function [  ] = Trial(  )
clear all;
close all;
clc;

tic;
A=rand([1000,1000]);
B=rand([1000,1000]);
C=A*B;
toc

end

经过的时间是0.073883秒。

3 个答案:

答案 0 :(得分:4)

为了充分利用Eigen,在启用OpenMP(例如,-fopenmp)的情况下使用优化ON(例如,-O3)进行编译,并禁用多线程或指定openmp真实数量的物理内核(例如,导出)如果你有8个超线程“核心”,则OMP_NUM_THREADS = 4。

最后,如果你的CPU支持FMA(例如-mfma),你也可以考虑使用devel分支并启用AVX(例如-mavx)和FMA。

答案 1 :(得分:3)

即使启用了所有优化,也很难击败MATLAB。为了充分利用Eigen,您需要使用并行支持(-fopenmp中的gcc)进行编译,并对(-O3)进行优化。即使在这种情况下,MATLAB也会稍微快一点,主要是因为它使用英特尔MKL专有库来充分利用英特尔芯片,所以除非你买它,否则我认为你不会击败它。我目前正在使用Eigen进行项目,并且无法击败MATLAB(至少不能用于密集矩阵乘法)。

例如,A*B其中AB1000 x 1000复杂矩阵,我可以得到的最佳平均时间是:

MATLAB:0.32秒 Eigen:0.44秒

2000 x 2000

MATLAB:2.80秒 Eigen:3.45秒

系统:MacbookPro 2013,OS X。

PS:您应该确保在(-O3)上启用优化,并使用并行支持-fopenmp进行编译。这就是你可能在运行时间上获得巨大差异的原因。所以你应该把你的程序编译为:

g++ -O3 -fopenmp <other compiling flags/parameters> main.cpp

答案 2 :(得分:-1)

实际上Matlab(如果你不买昂贵的并行计算工具箱)几乎不使用多线程。它只在Matlab调用的库中使用,它们可能比你现在使用的更有效。

您可以查看此链接以了解(并检查)您的Matlab使用的库http://undocumentedmatlab.com/blog/math-libraries-version-info-upgrade

它也可以在你的C程序中使用它们(虽然它们可能隐藏了标题或者某些东西,至少你还有.dll,因为它们需要它来运行Matlab)