[英]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
,其中A
和B
是1000 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.