我想使用 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 秒。
最佳答案
要击败 MATLAB
是极其困难的,即使启用了所有优化。要充分利用 Eigen
,您需要使用并行支持进行编译(gcc
中的 -fopenmp
),并打开优化( -O3
).即使在这种情况下,MATLAB
也会稍微快一些,主要是因为它使用 Intel MKL 专有库来充分利用 Intel 芯片,所以除非你购买它,否则我认为你不会能够打败它。我目前正在为一个项目使用 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
关于c++ - 如何使用 eigen 库针对 matlab 加速这个 C++ 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296152/