我想用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秒。
答案 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
其中A
和B
是1000 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)