LAPACK / BLAS gegen einfache "for" -Schleifen

7

Ich möchte ein Stück Code migrieren, das eine Reihe von Vektor- und Matrixberechnungen nach C oder C ++ enthält, mit dem Ziel, den Code so weit wie möglich zu beschleunigen.

Sind lineare Algebra-Berechnungen mit for Schleifen in C-Code so schnell wie Berechnungen mit LAPACK / BLAS, oder gibt es eine einzigartige Beschleunigung durch die Verwendung dieser Bibliotheken?

Mit anderen Worten, könnte einfacher C-Code (unter Verwendung von for -Schleifen und dergleichen) lineare Algebra-Berechnungen so schnell durchführen wie Code, der LAPACK / BLAS verwendet?

    
behzad.nouri 21.02.2011, 03:14
quelle

4 Antworten

16

Vom Hersteller bereitgestellte LAPACK / BLAS-Bibliotheken (Intels IPP / MKL wurden bereits erwähnt, aber auch AMDs ACML und andere CPU-Hersteller wie IBM / Power oder Oracle / SPARC bieten ebenfalls Entsprechungen) sind oft hochgradig für bestimmte CPU-Fähigkeiten optimiert das wird die Leistung von großen -Datensätzen erheblich verbessern.

Oft haben Sie jedoch sehr spezifische kleine Daten, mit denen Sie arbeiten können (z. B. 4x4-Matrizen oder 4D-Punktprodukte, dh Operationen, die bei der 3D-Geometrieverarbeitung verwendet werden). BLAS / LAPACK sind Overkill, aufgrund von anfänglichen Tests, die von diesen Unterroutinen ausgeführt werden, welche Codepfade abhängig von den Eigenschaften des Datensatzes zu wählen sind. In diesen Situationen kann ein einfacher C / C ++ - Quellcode, der möglicherweise SSE2 ... 4-Eigen- und / oder Compiler-erzeugte Vektorisierung verwendet, BLAS / LAPACK übertreffen Aus diesem Grund hat Intel zum Beispiel zwei Bibliotheken - MKL für große lineare Algebra-Datensätze und IPP für kleine (Grafikvektoren) -Datensätze.

In diesem Sinne

  • Was genau ist Ihr Datensatz?
  • Welche Matrix / Vektorgrößen?
  • Was für lineare Algebraoperationen?

Auch in Bezug auf "einfache for-Schleifen": Geben Sie dem Compiler die Möglichkeit, für Sie zu vektorisieren. I.e. etwas wie:

%Vor%

könnte für einen vektorisierenden Compiler besser geeignet sein als die einfache

%Vor%

Ausdruck. In gewisser Weise wird das, was Sie mit Berechnungen mit for loops meinen, erheblich beeinflussen.
Wenn Ihre Vektordimensionen jedoch groß genug sind, ist die BLAS-Version

%Vor%

ist sauberer Code und wahrscheinlich schneller.

Auf der Referenzseite könnten diese von Interesse sein:

FrankH. 21.02.2011, 11:02
quelle
7

Wahrscheinlich nicht. Es ist viel Arbeit, sicherzustellen, dass lapack / BLAS-Routinen optimiert und numerisch stabil sind. Während der Code oft auf der komplexen Seite ist, ist es in der Regel aus einem bestimmten Grund.

Abhängig von den beabsichtigten Zielen sollten Sie sich die Intel Math Kernel Library ansehen . Zumindest wenn Sie auf Intel-Prozessoren abzielen, ist es wahrscheinlich die schnellste, die Sie finden werden.

    
Jerry Coffin 21.02.2011 03:27
quelle
4

Numerische Analyse ist schwierig. Zumindest müssen Sie sich der Grenzen der Fließkomma-Arithmetik bewusst sein und wissen, wie Sie Operationen so ablaufen lassen, dass Sie die Geschwindigkeit mit der numerischen Stabilität ausgleichen. Dies ist nicht trivial.

Sie müssen tatsächlich etwas über das Gleichgewicht zwischen Geschwindigkeit und Stabilität wissen, das Sie tatsächlich brauchen. In der allgemeinen Softwareentwicklung ist vorzeitige Optimierung die Wurzel allen Übels. In der numerischen Analyse ist es der Name des Spiels. Wenn Sie beim ersten Mal nicht das richtige Gleichgewicht finden, müssen Sie mehr oder weniger alles neu schreiben.

Und es wird schwieriger, wenn Sie versuchen, lineare Algebra-Beweise in Algorithmen anzupassen. Sie müssen die Algebra wirklich verstehen, damit Sie sie in einen stabilen (oder stabilen) Algorithmus umwandeln können.

Wenn ich Sie wäre, würde ich die LAPACK / BLAS API anvisieren und nach der Bibliothek suchen, die für Ihren Datensatz funktioniert.

Sie haben viele Optionen: LAPACK / BLAS, GSL und andere selbstoptimierende Bibliotheken, Vender-Bibliotheken.

    
nomen 29.07.2012 16:08
quelle
0

Ich treffe diese Bibliotheken nicht sehr gut. Aber Sie sollten bedenken, dass Bibliotheken in der Regel ein paar Tests in Parametern durchführen, sie haben ein "Kommunikations-System" zu Fehlern und sogar die Zuweisung zu neuen Variablen, wenn Sie eine Funktion aufrufen ... Wenn die Berechnungen trivial sind, können Sie es vielleicht versuchen Sie es selbst, passen Sie sich Ihren Bedürfnissen an ...

    
FernandoP 21.02.2011 03:30
quelle

Tags und Links