2013-07-14 8 views
6

Ich erkunde gerade die Armadillo C++ Bibliothek für lineare Algebra. Soweit ich es verstanden habe, verwendet es die LAPACK/BLAS-Bibliothek für grundlegende Matrixoperationen (z. B. Matrixmultiplikation). Als Windows-Benutzer habe ich LAPACK/BLAS von hier heruntergeladen: http://icl.cs.utk.edu/lapack-for-windows/lapack/#running. Das Problem ist, dass Matrixmultiplikationen verglichen mit Matlab oder sogar R sehr langsam sind. Zum Beispiel multipliziert Matlab zwei 1000x1000 Matrizen in ~ 0,15 Sekunden auf meinem Computer, R benötigt ~ 1 Sekunde, während C++/Armadillo/LAPACK/BLAS mehr als 10 benötigt Sekunden dafür.Schnelle LAPACK/BLAS für die Matrix-Multiplikation

So basiert Matlab auf hoch optimierten Bibliotheken für lineare Algebra. Meine Frage ist, ob es einen schnelleren LAPACK/BLAS Bray gibt, der von Armadillo verwendet werden kann? Gibt es alternativ eine Möglichkeit, Matlab-Bibliotheken für lineare Algebra irgendwie zu extrahieren und sie in C++ zu verwenden?

+2

Wenn Sie -1 setzen, bitte geben Sie mir einen Hinweis, wie könnte ich meine Frage verbessern. – Kasablanca

Antwort

12

LAPACK nicht Matrixmultiplikation tun. Es ist BLAS, das Matrixmultiplikation bereitstellt.

Wenn Sie ein 64-Bit-Betriebssystem haben, empfehle ich, zuerst eine 64-Bit-Version von BLAS zu versuchen. Dies wird Ihnen eine sofortige Verdoppelung der Leistung bringen.

Zweitens, schauen Sie sich eine leistungsstarke Implementierung von BLAS, wie OpenBLAS. OpenBLAS verwendet sowohl Vektorisierung als auch Parallelisierung (dh Multi-Core). Es ist ein kostenloses (kostenloses) Open-Source-Projekt.

Matlab verwendet intern die Intel MKL-Bibliothek, die Sie auch mit der Armadillo library verwenden können. Intel MKL ist eine geschlossene Quelle, ist aber für nicht-kommerzielle Nutzung frei. Beachten Sie, dass OpenBLAS eine Matrixmultiplikationsleistung erzielen kann, die gleich oder besser als Intel MKL ist.

Beachten Sie, dass lineare Hochleistungsalgebra unter Linux und Mac OS X im Allgemeinen einfacher zu erreichen ist als unter Windows.

+0

Vielen Dank für die umfassende Antwort! – Kasablanca

+0

Ich denke deine letzte Aussage ist falsch. Zum Beispiel ist MATLAB unter Windows schneller als unter Linux. Im Allgemeinen ist Intel MKL unter Windows schneller. – Royi

+0

MKL für Windows und Linux verwenden die gleiche Codebasis – mtall

1

gibt es eine Möglichkeit Matlab linearen Algebra Bibliotheken irgendwie zu extrahieren und sie in C++ verwendet Ja, für C++ Aufruf Matlab-Funktion, auf diesen Link verweisen: How to Call Matlab Functions from C++

+0

Matlab-Compiler kostet viel! – alexbuisson

+0

@alexbuisson Dann warum Matlab? Ich kenne eine weitere Bibliothek für lineare Algebra, BLAS, die für Hochleistungsrechnen geeignet ist. – lulyon

+0

Ja, deshalb verwende ich Octave. Es war nur eine Anmerkung zu beachten, dass Matlab IDE und Compiler 2 verschiedene Dinge sind. – alexbuisson

4

Hinzufügen zu dem, was bereits gesagt wurde, sollten Sie auch ein hohes Maß an Optimierung verwenden:

  1. Achten Sie darauf, entweder die O2 oder die O3 Compiler-Flag.

  2. Link zu den oben genannten Hochleistungs (und möglicherweise multi-threaded) BLAS-Bibliotheken. AFAIK MKL ist jedoch nur für Unix-Plattformen frei verfügbar, wenn Sie eine Linux-Box wie Cygwin in Windows verwenden, sollte dies in Ordnung sein, denke ich. OpenBLAS ist auch multi-threaded.

  3. In vielen Bibliotheken, setzt das Setzen des Symbols NDEBUG (z. B. Übergabe des Compiler-Flags -DNDEBUG) teure Bereichsüberprüfung und Assertions deaktiviert.Armadillo hat sein eigenes Symbol namens ARMA_NO_DEBUG, das Sie entweder manuell einstellen können, oder Sie können die Header-Datei config.hpp (im Verzeichnis armadillo include) bearbeiten und die entsprechende Zeile auskommentieren. Ich vermute, bin da Sie in der Lage waren, in Gürteltier auf externe BLAS Nutzung zu wenden, sollten Sie mit dieser Konfigurationsdatei vertraut sowieso ...

ich zwischen Gürteltier/MKL_BLAS und Matlab auf meinem Intel Core einen schnellen Vergleich tat -i7 Arbeitsplatz. Für die C++ - Exe habe ich -O3, MKL BLAS verwendet und ARMA_NO_DEBUG definiert. Ich multiplizierte 1000x1000 Zufallsmatrizen 100 Mal und gemittelt die Multiplikationszeiten. Die C++ Implementierung war etwa 1,5 mal schneller als Matlab.

hoffe, das hilft