1

私は有限差分法プログラムを書いています。
私はIntel Math Kernel Libraryを使用しています。LAPACK dgesv VS MATLAB mldivide

たとえば、1000x1000の行列Aと1000x1000の行列B.
インテルMKLでは、cblas_dgemm()関数を使用するA * Bは約600ミリ秒かかりました。
MATLABでは、A * Bに約800ミリ秒かかりました。
私はMKLが非常に速いと思った。

しかし、1000×1000行列Aと1000x1ベクトルB、
とMATLABでの\ B(関数mldivide)は、それが40ミリ秒、
を取ったが、MKLには、LAPACKE_dgesvを使用して、それが400ミリ秒を取りました!

私の質問は、
なぜmldivideでは、MATLABは非常に高速で、MKLはとても遅いのですか?

行列AとベクトルBの全体がランダムな値で埋められます。

私は2016 Update 3のクラスター・エディション
MATLAB R2012b
のVisual Studio 2015
インテル®Parallel StudioののXEを使用してい

はありがとうございます。

EDITED

最初に、C++コード。

#include "mkl.h" 
#include "time.h" 

int n = 1000; 
double *a = (double *)malloc(sizeof(double) * n * n); 
for(int i = 0;i < n * n;i++) a[i] = rand(); 
double *b = (double *)malloc(sizeof(double) * n); 
for(int i = 0;i < n;i++) b[i] = rand(); 
int *ipiv = (int *)malloc(sizeof(int) * n); 
time_t now = clock(); 
int info = LAPACKE_dgesv(LAPACK_ROW_MAJOR,n,1,a,n,ipiv,b,1); 
time_t ms = clock() - now; 
printf("%d ms",ms); 

第2に、MATLABコード。

n = 1000; 
a = rand(n,n); 
b = rand(n,1); 
tic; 
c = a\b; 
toc * 1000 

私は時間を測定するのを間違っていたと思います。
ありがとうございます。

+0

@kangshiyin右、私は間違っています。ありがとう。 – rayryeng

+0

タイミングコードを表示できますか?タイミングの間に間違っていることが多いことがたくさんあります。 – kangshiyin

+0

@kangshiyin私は編集した質問をしました。ありがとうございました。 –

答えて

2

タイミングに問題があります。この操作では、MKLとMATLABのどちらもウォームアップ効果を示します。 MKLは二回、あなたのCコードで、2番目のを見つけるでしょう、あなたの時間がはるかに高速のMatlabのために

247.349940 ms 
14.353588 ms 

ようであれば、それは

ans = 

    825.5090 

ans = 

    21.7870 

での結果はまた、非常にあなたのマルチスレッドによって異なりますのでご注意ください設定。

違いは、MATLABはウォームアップステージで作成したリソースを終了するまで保持するため、MATLABを終了してもう一度起動しない限り、ウォームアップエフェクトは再び表示されません。 Matlabスクリプトを再度実行すると、リソースが再利用されます。しかし、MKLの場合は、一度だけ時間をおいても、ウォームアップフェーズで解決に時間を合わせ、cプログラムを終了し、リソースを再利用せずにリリースします。

ウォームアップはMatlab固有の現象ではありません。リソースは、CプログラムとMatlabスクリプトの両方に影響を与えるMKLのLAPACKの方程式を解くために、再割り当て可能なメモリバッファを事前に割り当てることができます。

+1

ありがとうございます。私はDGESV引数をLAPACK_COL_MAJORに変更しました.MATLABとMKLで100倍の時間を計測しました(ウォームアップ時間は最初の計測に含まれ、残りの99はウォームアップ時間を含まない可能性があります)。結果は、MKLは1.76倍高速です!ありがとうございました –

関連する問題