1

Ich schreibe Finite-Differenzen-Methode Programm.
Ich verwende Intel Math Kernel Library. Beispiel: 1000x1000 Matrix A und 1000x1000 Matrix B.
In Intel MKL benötigte A * B mit der Funktion cblas_dgem() etwa 600 ms.
In MATLAB dauerte A * B etwa 800 ms.
Ich dachte MKL ist sehr schnell.LAPACK dgesv VS MATLAB mldivide

jedoch 1000x1000 Matrix A und 1000x1 Vektor B,
und A \ B (mldivide) in MATLAB, dauerte es 40 ms,
aber in MKL, mit LAPACKE_dgesv, dauerte es 400 ms!

so ist meine Frage,
Warum in mldivide, MATLAB ist so schnell und MKL ist so langsam?

Matrix A und Vektor B ist ganz mit zufälligen Werten gefüllt.

Ich verwende
MATLAB R2012b
Visual Studio 2015
Intel Parallel Studio XE 2016 Update 3 Cluster Edition

Danke.

EDITED

ersten, C++ Code.

#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); 

Zweitens, MATLAB-Code.

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

Ich glaube, ich habe keine Fehler bei der Messung der Zeit.
Vielen Dank.

+0

@ kangshiyin Richtig, ich falsch gelesen. Vielen Dank. – rayryeng

+0

Können Sie Timing-Code anzeigen? Es gibt viele Dinge, die beim Timing schief gehen können. – kangshiyin

+0

@kangshiyin Ich habe die Frage bearbeitet. Vielen Dank. –

Antwort

2

Sie haben ein Problem mit dem Timing. Sowohl MKL als auch MATLAB zeigen einen Aufwärm-Effekt für diesen Vorgang. Wenn Sie Zeit MKL zweimal in Ihrem C-Code, werden Sie das zweite ist viel schneller als

247.349940 ms 
14.353588 ms 

Für Matlab zu finden, ist es

ans = 

    825.5090 

ans = 

    21.7870 

Bitte die Ergebnisse beachten Sie auch sehr auf Multi-Thread hängt die Einstellungen.

Der Unterschied besteht darin, dass Sie den Warm-up-Effekt erst dann wieder sehen, wenn Matlab die in der Warm-up-Phase erstellten Ressourcen bis zum Beenden speichert, es sei denn, Sie beenden Matlab und starten es erneut. Wenn Sie das Matlab-Skript erneut ausführen, werden die Ressourcen wiederverwendet. Aber für MKL, wenn Sie nur einmal Zeit, Sie immer die Zeit mit der Aufwärmphase Zeit zu lösen, beenden Sie das c-Programm und geben Sie die Ressourcen frei, ohne sie erneut zu verwenden.

Aufwärmen ist kein Matlab-spezifisches Phänomen. Die Ressourcen könnten vorab zugewiesene wiederverwendbare Speicherpuffer zum Lösen der Gleichungen in MKL's LAPACK sein, was sowohl das C-Programm als auch das Matlab-Skript betrifft.

+1

Danke. Ich änderte DGESV Argument zu LAPACK_COL_MAJOR, und ich mastete 100 Mal in MATLAB und MKL (Aufwärmzeit ist in der Messung der ersten enthalten, und die anderen 99 möglicherweise keine Aufwärmzeit enthalten). Das Ergebnis ist, MKL ist 1,76 mal schneller !! Vielen Dank –