簡體   English   中英

如何使用針對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 <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 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秒。

為了充分利用Eigen,請在啟用優化的情況下(例如-O3編譯器標志)進行編譯,在啟用OpenMP的情況下(例如-fopenmp)進行編譯,並禁用超線程,或者指定為openmp真正的物理核數(例如,導出OMP_NUM_THREADS =如果您有8個超線程“核心”,而有4個物理核心,則為4)。

最后,如果您的CPU確實支持FMA(例如-mfma),則也可以考慮使用devel分支並啟用AVX(例如-mavx)和FMA。

即使啟用了所有優化,也很難擊敗MATLAB 要充分利用Eigen您需要使用並行支持( gcc -fopenmp進行gcc ,然后打開優化功能( -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,OSX。

PS:您應該絕對確保打開優化( -O3 )並使用並行支持-fopenmp編譯。 這就是您可能在運行時間上獲得如此巨大差異的原因。 因此,您應將程序編譯為:

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

實際上,Matlab(如果您不購買昂貴的並行計算工具箱)幾乎不使用多線程。 它僅在Matlab調用的庫中使用,可能比您現在使用的庫更有效。

您可以檢查此鏈接以了解(並檢查)您的Matlab使用哪些庫http://undocumentedmatlab.com/blog/math-libraries-version-info-upgrade

也可以在您的C程序中使用它們(盡管它們可能隱藏了標頭或其他內容,但至少您仍然擁有.dll,因為它們需要它們來運行Matlab)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM