私は有限差分法プログラムを書いています。
私は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
私は時間を測定するのを間違っていたと思います。
ありがとうございます。
@kangshiyin右、私は間違っています。ありがとう。 – rayryeng
タイミングコードを表示できますか?タイミングの間に間違っていることが多いことがたくさんあります。 – kangshiyin
@kangshiyin私は編集した質問をしました。ありがとうございました。 –