如何在matlab环境下用特征库加速这个c++程序
How to speed up this C++ program with eigen library against matlab?
我想使用c++进行大型线性代数计算。作为第一步,我用c++和matlab编写了这些比较程序。我也给出了惊人的执行时间。你能建议如何击败matlab或至少获得相当的性能吗?我知道c++使用高度矢量化的方法进行计算。那么在涉及线性代数的大型科学编程中,应该总是使用matlab而不是c++吗?我个人认为matlab对于大型计算的性能不是很好,所以在这种情况下c++比matlab更受欢迎。然而,我的程序结果却与此相反。
用gcc编译的c++程序:
#include <iostream>
#include <EigenDense> //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 s
下面是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
也会稍微快一点,主要是因为它使用英特尔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
为了获得最好的Eigen,编译时启用优化(例如-O3编译器标志),启用OpenMP(例如-fopenmp),并禁用超线程或指定OpenMP物理内核的真实数量(例如,如果您有8个超线程"内核",则导出OMP_NUM_THREADS=4)。
最后,如果你的CPU不支持FMA(例如-mfma),你也可以考虑使用devel分支并启用AVX(例如-mavx)和FMA。
实际上Matlab(如果您不购买昂贵的并行计算工具箱)几乎不使用多线程。它只在Matlab调用的库中使用,这些库可能比你现在使用的更有效。
您可以查看此链接以了解(并检查)Matlab使用的库http://undocumentedmatlab.com/blog/math-libraries-version-info-upgrade
也可以在C程序中使用它们(尽管它们可能隐藏了头文件或其他东西,但至少您仍然拥有.dll,因为它们需要运行Matlab)
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 加速C++练习2.4
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 为什么我的程序在使用预留后没有加速?
- 哪种方法可以建议加速大规模(CPU)并行程序
- 当该应用程序中加速文件的最后一个修改时间发生更改时,如何重新启动应用程序
- 我们可以在没有安装工具包的情况下运行CUDA加速程序
- 运行加速引导程序
- SDL2硬件加速渲染器在Xubuntu上使用专有驱动程序时会崩溃Linux
- 用c#或c++中更快的时钟加速应用程序
- 在 Win x64 应用程序中C++加速库
- 加速C++:编译第4章中的程序
- 多线程c++程序加速一个求和循环
- 如何在matlab环境下用特征库加速这个c++程序
- 映射模式在多线程程序中的性能低于预期(4倍加速vs 8倍加速)
- 我为openmp加速程序生成随机数做得对吗?