c++ - 如何使用 eigen 库针对 matlab 加速这个 C++ 程序?

标签 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 秒。

最佳答案

要击败 MATLAB 是极其困难的,即使启用了所有优化。要充分利用 Eigen,您需要使用并行支持进行编译(gcc 中的 -fopenmp),并打开优化( -O3).即使在这种情况下,MATLAB 也会稍微快一些,主要是因为它使用 Intel MKL 专有库来充分利用 Intel 芯片,所以除非你购买它,否则我认为你不会能够打败它。我目前正在为一个项目使用 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

关于c++ - 如何使用 eigen 库针对 matlab 加速这个 C++ 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296152/

相关文章:

c++ - 使用列表对象内部对象的派生函数

matlab - 计算平均值周围 95% 的间隔

Matlab 绘图 : remove connecting line between disconnected regions?

c++ - 如何将 Argb32 加载到 Eigen Matrix 中以获得最佳性能?

c++ - 迭代器指向 "find_if"匹配后的第一个元素,为什么?

c++ - Cap'n Proto - 将结构反序列化/序列化为 std::string 以存储在 LevelDB 中

c++ - DJGPP 的恐惧错误

matlab - 如何以 Matlab eps 格式导出变音符号(或任何外来字符)?

c++ - Eigen middleCols() 惩罚

c++ - 如何创建自定义 Eigen::Map 类具有非平凡的步幅