Empfehlungen für eine brauchbare, schnelle C ++ - Matrixbibliothek?


158

Hat jemand Empfehlungen zu einer verwendbaren, schnellen C ++ - Matrixbibliothek?

Was ich unter verwendbar verstehe, ist folgendes:

  • Matrix-Objekte haben eine intuitive Benutzeroberfläche (Beispiel: Ich kann beim Indizieren Zeilen und Spalten verwenden)
  • Mit der Matrix-Klasse kann ich alles machen, was ich mit LAPACK und BLAS machen kann
  • Einfach zu erlernende und zu verwendende API
  • Relativ schmerzlos unter Linux zu installieren (ich benutze Ubuntu 11.04 gerade)

Benutzerfreundlichkeit ist für mich im Moment wichtiger als Geschwindigkeit oder Speichernutzung, um eine vorzeitige Optimierung zu vermeiden. Beim Schreiben des Codes konnte ich immer 1-D-Arrays (oder STL-Vektoren) und eine geeignete Index- oder Zeigerarithmetik verwenden, um eine Matrix zu emulieren, aber ich würde es vorziehen, um Fehler zu vermeiden. Ich möchte meine mentalen Anstrengungen auch auf das eigentliche Problem konzentrieren, das ich zu lösen und in den Problembereich zu programmieren versuche, anstatt einen Teil meiner endlichen Aufmerksamkeit darauf zu verwenden, mich an all die kleinen Programmiertricks zu erinnern, mit denen ich Matrizen als Arrays emuliert habe und erinnern Sie sich an LAPACK-Befehle usw. Je weniger Code ich schreiben muss und je standardisierter er ist, desto besser.

Dicht gegen dünn spielt noch keine Rolle; Einige der Matrizen, mit denen ich zu tun habe, werden spärlich sein, aber nicht alle. Wenn ein bestimmtes Paket jedoch dichte oder spärliche Matrizen gut verarbeitet, ist dies erwähnenswert.

Templating ist mir auch nicht so wichtig, da ich mit numerischen Standardtypen arbeite und nichts anderes als Doubles, Floats oder Ints speichern muss. Es ist schön, aber nicht notwendig für das, was ich gerne machen würde.


1
Ist die Verwendung von CUDA eine Option?
Flipchart

1
Es könnte später sein. Ich interessiere mich momentan nicht für CUDA, weil ich eine Bibliothek für eine Anwendung aufbaue, bei der die Matrixmultiplikation das geringste meiner Probleme ist. Der größte Teil des Aufwands wird für den Aufruf eines linearen Programmlösers mit gemischten Ganzzahlen aufgewendet, daher wäre die Verwendung von CUDA ein Overkill. Nach Abschluss meiner Diplomarbeit möchte ich Algorithmen untersuchen, die linearer algebralastig und weniger optimierungsorientiert sind. Ich empfehle Ihnen auf jeden Fall, über CUDA-Bibliotheken zu schreiben, wenn Sie Erfahrung mit ihnen haben, da ich mir sicher bin, dass andere Leute daran interessiert wären, Ihre Gedanken zu erfahren.
Geoff Oxberry

Was ist mit Intel MKL und IPP?
Royi

Antworten:


146

Ich habe bisher Folgendes aus der Online-Forschung zusammengetragen:

Ich habe Armadillo ein wenig benutzt und fand die Oberfläche intuitiv genug und es war einfach, Binärpakete für Ubuntu zu finden (und ich gehe von anderen Linux-Distributionen aus). Ich habe es nicht aus dem Quellcode zusammengestellt, aber ich hoffe, dass es nicht zu schwierig wird. Es erfüllt die meisten meiner Entwurfskriterien und verwendet eine dichte lineare Algebra. Es kann LAPACK- oder MKL-Routinen aufrufen. Es ist in der Regel nicht erforderlich, Armadillo zu kompilieren. Es handelt sich um eine rein vorlagenbasierte Bibliothek. Sie müssen nur den Header und den Link zu BLAS / LAPACK oder MKL usw. einfügen.

Ich habe gute Dinge über Eigen gehört , es aber nicht benutzt. Es behauptet, schnell zu sein , verwendet Templating und unterstützt dichte lineare Algebra. Es hat weder LAPACK noch BLAS als Abhängigkeit, scheint aber in der Lage zu sein, alles zu tun, was LAPACK kann (plus einige Dinge, die LAPACK nicht kann). Viele Projekte verwenden Eigen, was vielversprechend ist. Es hat ein Binärpaket für Ubuntu, aber als reine Header-Bibliothek ist es trivial, es auch anderswo zu verwenden.

Die Matrix Template Library Version 4 sieht ebenfalls vielversprechend aus und verwendet Vorlagen . Es unterstützt lineare Algebra mit und ohne Dichte und kann UMFPACK als Solver mit geringer Dichte aufrufen . Die Funktionen sind auf ihrer Website etwas unklar. Es gibt ein Binärpaket für Ubuntu, das von der Website heruntergeladen werden kann.

PETSc , das von einem Team des Argonne National Laboratory geschrieben wurde, hat Zugriff auf spärliche und dichte lineare Löser, daher gehe ich davon aus, dass es als Matrixbibliothek fungieren kann. Es ist in C geschrieben, hat aber C ++ - Bindungen, denke ich (und selbst wenn nicht, ist das Aufrufen von C aus C ++ kein Problem). Die Dokumentation ist unglaublich gründlich. Das Paket ist ein bisschen übertrieben für das, was ich jetzt tun möchte (Matrixmultiplikation und Indexierung zum Einrichten von linearen Programmen mit gemischten Ganzzahlen), könnte aber in Zukunft als Matrixformat für mich oder für andere Personen mit anderen Bedürfnissen nützlich sein als ich.

Trilinos , geschrieben von einem Team des Sandia National Laboratory, bietet in seiner Epetra-Komponente objektorientierte C ++ - Schnittstellen für dichte und spärliche Matrizen und in seiner Tpetra-Komponente vorgefertigte Schnittstellen für dichte und spärliche Matrizen. Es enthält auch Komponenten, die lineare Lösungs- und Eigensolverfunktionen bereitstellen. Die Dokumentation scheint nicht so ausgefeilt oder auffällig zu sein wie PETSc. Trilinos scheint das Sandia-Analogon von PETSc zu sein. PETSc kann einige der Trilinos-Löser aufrufen. Binärdateien für Trilinos sind für Linux verfügbar.

Blitz ist eine objektorientierte C ++ - Bibliothek mit Linux-Binärdateien. Es scheint nicht aktiv gewartet zu werden (2012-06-29: Eine neue Version ist erst gestern erschienen!), Obwohl die Mailingliste aktiv ist, so dass es eine Community gibt, die sie verwendet. Es scheint nicht viel für die numerische lineare Algebra jenseits von BLAS zu tun und sieht aus wie eine dichte Matrixbibliothek. Es werden Vorlagen verwendet.

Boost :: uBLAS ist eine objektorientierte C ++ - Bibliothek und Teil des Boost-Projekts. Es unterstützt Templating und dichte numerische lineare Algebra. Ich habe gehört, es ist nicht besonders schnell.

Das Template Numerical Toolkit ist eine von NIST entwickelte objektorientierte C ++ - Bibliothek. Sein Autor, Roldan Pozo, scheint gelegentlich Patches beizusteuern, aber es scheint nicht mehr in aktiver Entwicklung zu sein (letztes Update war 2010). Es konzentriert sich auf die dichte lineare Algebra und bietet Schnittstellen für einige grundlegende Matrixzerlegungen und einen Eigenwertlöser.

Elemental , entwickelt von Jack Poulson, ist ein (paralleles) lineares Algebra-Softwarepaket mit verteiltem Speicher, das in einem ähnlichen Stil wie FLAME geschrieben wurde . Eine Liste der Funktionen und Hintergrundinformationen zum Projekt finden Sie in seiner Dokumentation . FLAME selbst hat eine Bibliothek für sequentielle und gemeinsam genutzte, dichte lineare Algebra namens libflame , die in objektorientiertem C geschrieben zu sein scheint. Libflame ähnelt LAPACK, hat jedoch eine bessere Notation, die den Algorithmen zugrunde liegt, um die Entwicklung schneller numerischer Werte zu ermöglichen lineare algebra bibliotheken eher eine wissenschaft und weniger eine schwarze kunst.

Es gibt andere Bibliotheken, die der Liste hinzugefügt werden können. Wenn wir spärliche lineare Algebra-Pakete als "Matrix-Bibliotheken" zählen, ist SuiteSparse , das objektorientiert programmiert ist , das beste freie, das ich in C kenne . Ich habe SuiteSparse verwendet und fand es ziemlich einfach, es zu erlernen. Es hängt von BLAS und LAPACK für einige der Algorithmen ab, die spärliche Probleme in viele kleine, dichte lineare Algebra-Teilprobleme zerlegen. Der Hauptautor des Pakets, Tim Davis, ist unglaublich hilfsbereit und ein großartiger Allrounder.

Die Harwell-Subroutinenbibliotheken sind für ihre spärlichen linearen Algebra-Routinen bekannt und für akademische Benutzer kostenlos. Sie müssen jedoch diesen Prozess durchlaufen, indem Sie ein Formular ausfüllen und für jede Datei, die Sie herunterladen möchten, eine E-Mail erhalten. Da die Unterprogramme häufig Abhängigkeiten aufweisen, muss bei Verwendung eines Solvers möglicherweise fünf oder sechs Dateien heruntergeladen werden, und der Vorgang kann etwas langwierig werden, insbesondere weil die Formulargenehmigung nicht sofort erfolgt.

Es gibt auch andere spärliche lineare Algebra-Löser, aber soweit ich das beurteilen kann, konzentrieren sich MUMPS und andere Pakete hauptsächlich auf die Lösung linearer Systeme, und das Lösen linearer Systeme ist momentan das geringste meiner Probleme. (Vielleicht benötige ich diese Funktionalität später, und sie könnte für andere nützlich sein.)


2
Ich denke, du hast Eigen mit Elemental verwechselt. Ich habe nicht an Eigen gearbeitet, obwohl ich von dem Projekt sehr beeindruckt bin. Elemental zielt hauptsächlich auf Maschinen mit verteiltem Speicher ab.
Jack Poulson

3
Ich denke meine erste Frage wäre: Möchtest du jemals etwas parallel laufen lassen?
Matt Knepley

1
Ich sollte Trilinos erwähnen ... obwohl es hier (noch) nicht viel Sichtbarkeit bekommt, ist es eine praktikable Alternative zu PETSc, mit einem Matrixpaket mit Vorlagen, einem Eigensolver und einem spärlichen Matrixlöser, es hat auch ein Paket speziell für die Abstraktion der Buchhaltung eines Algorithmus gedacht, obwohl ich nicht weiß, wie gut es funktioniert.
Andrew Spott

1
Eigen scheint großartig zu sein - ein Kollege von mir hat es in einem professionellen Kontext verwendet und kann Sie schnell genug in Betrieb nehmen, ohne Leistungseinbußen hinnehmen zu müssen.
qdot

7
Ich würde Ihrer Antwort auch die folgenden Bibliotheken hinzufügen: ViennaCL - OpenCL-basierte C ++ - Header-Bibliothek, die in Eigen und MTL integriert werden kann. PLASMA - ein UTK-basiertes Redesign der BLAS- und LAPACK-Bibliotheken mit kachelbasierten Zerlegungen. MAGMA - ein weiteres UTK-Projekt, das sich auf die Verbesserung der LAPACK / BLAS-Leistung konzentriert.
Aron Ahmadia

24

Dieses Dokument wurde im März 2009 verfasst, um bei der Auswahl einer linearen Algebra-Bibliothek für eine wissenschaftliche Bibliothek zu helfen. Es bewertet die Portabilität, das High-Level-Interface und die Lizenzierung für mehrere Bibliotheken, darunter Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos und uBlas. Es scheint besonders gern Flens und Seldon . (Eine der Anforderungen war, dass C ++ - Vorlagen und spärliche Matrizen unterstützt werden mussten.)


17

Von den oben aufgeführten Projekten gibt es tatsächlich nur zwei Schwergewichte, die (und das aus guten Gründen) extrem weit verbreitet sind: PETSc und Trilinos. Beide sind professionell entwickelt und verfügen über eine große Entwicklerbasis. Alle anderen Projekte sind im Vergleich zu diesen beiden eher kleine Projekte, und ich würde empfehlen, sie zu begleiten, da (i) sie noch lange unterstützt werden und (ii) sie wahrscheinlich bereits über alle Funktionen verfügen, die Sie jemals benötigen werden lineare Algebra (und noch viel mehr).


4
PETSc bietet nicht viel mehr als eine leicht abstrakte Schnittstelle zu ScaLAPACK und PLAPACK. Wenn Geoff an einer bequemen dichten linearen Algebra interessiert ist, denke ich, dass PETSc übertrieben ist (ich weiß nicht genug über die dichten Fähigkeiten von Trilinos, um Kommentare
abzugeben

@AronAhmadia: Zu diesem Zeitpunkt hat sich die Antwort meiner Meinung nach eher in eine Community-Wiki-Ressource verwandelt, weshalb ich auf Anfrage von Kommentatoren Pakete hinzugefügt habe.
Geoff Oxberry

3
@WolfgangBangerth: Ich finde es wichtig, Designziele zu nennen. Wenn das Ziel darin besteht, eine Software zu schreiben, die langlebig ist und von anderen verwendet werden soll, und die lineare Algebra ein wesentlicher Bestandteil dieser Software ist, sind PETSc und Trilinos eine gute Wahl. Es gibt jedoch Fälle, in denen leichtgewichtigere Optionen vorzuziehen und nützlich sind, da sie über einfachere APIs verfügen und fast dieselbe Aufgabe in weniger Codezeilen ausführen können. Schließlich spielt die Auswahlverzerrung eine Rolle für das Überleben von Codes. Wenn niemand die kleineren Codes benutzt, werden sie keine Basis wie PETSc und Trilinos haben oder aufbauen.
Geoff Oxberry

1
Zusätzlich zu den Aussagen von Geoff stammt die überwiegende Mehrheit der Funktionen von PETSc und Trilinos aus Wrappern um externe Bibliotheken. Zu sagen, dass niemand diese externen Bibliotheken direkt nutzen sollte, kommt mir seltsam vor.
Jack Poulson

1
@ JackPoulson: Ich stehe tatsächlich zu meinem Kommentar. Ja, PETSc verpackt viele Einzelverpackungen. Dies geschieht jedoch mit einer einheitlichen Benutzeroberfläche, und daher ist es einfacher, dies einmal zu lernen, als die Besonderheiten der einzelnen Pakete, die Konventionen und Stile benennen, kennenzulernen. Mit anderen Worten, während jedes einzelne Projekt die verpackten Pakete gleichermaßen nutzen kann, gibt es eine Synergie, die daraus resultiert, dass sie jedes Mal über PETSc genutzt werden.
Wolfgang Bangerth

11

Falls Sie es wollen

  • Matrixklassen mit intuitiver Oberfläche
  • Alle Funktionen von LAPACK und BLAS
  • Einfach zu erlernende und zu verwendende API
  • Einfach zu installieren

Dann empfehle ich Ihnen, sich meine Bibliothek FLENS anzuschauen . Ich habe es für genau diese Art von Aufgaben entworfen. Es erfordert jedoch einen C ++ 11-konformen Compiler (z. B. gcc 4.7 oder clang).

FLENS bietet genau dieselbe Leistung wie die zugrunde liegende BLAS-Implementierung. Es gibt einige (ziemlich alte) Benchmarks, die dies zeigen

Das Gleiche gilt für FLENS-LAPACK. Mit derselben BLAS-Implementierung erhalten Sie genau dieselbe Leistung wie mit Netlibs LAPACK.

Lassen Sie mich in Bezug auf neue Benchmarks näher auf die Details eingehen ...

Vor einiger Zeit habe ich Clint Whaley (den Autor von ATLAS) gefragt, was er von den auf der Eigen-Site veröffentlichten Benchmarks hält. Er hat gerade meinen Verdacht bestätigt, dass diese Benchmarks höchstwahrscheinlich nicht zuverlässig sind. In der Zwischenzeit realisierten einige andere Benchmarks, wie Clint es vorgeschlagen hatte. Details finden Sie auf der ATLAS-Seite und in der Eigen-Mailingliste. Die Benchmarks werden in Grafiken nicht gut dargestellt, aber sie zeigen, dass ATLAS immer etwa 40% schneller ist als Eigen. Dies widerspricht den Benchmarks der Eigen-Site, bestätigt jedoch andere Benchmarks (z. B. von blaze-lib).

Beachten Sie, dass für die dichte numerische lineare Algebra die Matrix-Matrix-Produkte am relevantesten sind. Persönlich ist es mir egal, ob Eigen oder ATLAS schneller ist. Wenn Eigen schneller als ATLAS wäre, würde ich Eigen als BLAS-Backend verwenden.

Haftungsausschluss: Ja, FLENS ist mein Baby! Das heißt, ich habe ungefähr 95% davon codiert und jede Codezeile hat sich gelohnt :-)


Hallo Michael, willkommen bei scicomp. Ihre URL funktioniert nicht für mich. Stimmt etwas mit Ihrem Server nicht?
Aron Ahmadia

Danke für den Tipp. Die URL ist korrekt, aber anscheinend haben wir ein Problem mit dem Dateiserver in der mathematischen Abteilung. Pünktlich zum Wochenende ...
Michael Lehn

1
Ok, ich habe gerade eine neue Dokumentation aus dem aktuellen Git-Repo erstellt und auf einen anderen Server kopiert: apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn



1

Was wäre die beste Matrixbibliothek für den Umgang mit kleinen Matrizen, die üblicherweise zum Beispiel beim Zusammensetzen von Finite-Elemente-Matrizen, zum Ausführen von Tensoroperationen usw. verwendet werden?

Ich benutze PETSc bereits für die Lösung der in meiner Anwendung auftretenden großen, dünn besetzten linearen Systeme, verwende aber derzeit meine eigene einfache Bibliothek, um mit diesen Matrizen / Vektoren umzugehen ... Ich überlege, auf eine schnellere Bibliothek umzusteigen wie die oben genannten.

Was wäre die beste Wahl, um mit PETSc zu koppeln? Eigen? Gürteltier? BOOST :: uBlas? MTL4? Ich verwende einige Dinge von BOOST, also habe ich zuerst über die Verwendung von BOOST :: uBlas nachgedacht, aber es gibt nicht viel Dokumentation, Beispiele usw.


2
Ich rate dringend von der Verwendung von uBlas ab, da es bekanntermaßen um eine Größenordnung langsamer ist als optimierte BLAS-Routinen. Ich denke, dass Eigen aufgrund cleverer Template-Tricks am besten für sehr kleine Matrizen geeignet ist.
Jack Poulson

1
Dies ist wahrscheinlich besser für eine separate Frage. Ich weiß, dass Eigen, MTL4 und Armadillo alle Tricks zum Lösen kleiner Systeme haben, aber ich denke, Sie fragen, wie man Matrizen zusammensetzt, und das weiß ich nicht. Normalerweise setze ich Matrizen Element für Element zusammen. Ich bin nicht sicher, ob eine der genannten Bibliotheken für die Kopplung mit PETSc geeignet ist. Ich bin noch kein PETSc-Benutzer. Ich bin Jacks Kommentar zu Boost :: uBlas gefolgt, weil er langsam ist.
Geoff Oxberry

1

Armadillo, Boost und andere sind jetzt Teil von Ceemple, einer schnellen JIT-basierten technischen C ++ - Computerumgebung. Erhältlich (kostenlos) unter http://www.ceemple.com .


0

Überrascht hat noch niemand TooN erwähnt . Ich benutze es seit fast 3 Jahren.

Es ist Eigen sehr ähnlich, wenn auch nicht so umfassend. Allerdings denke ich, dass es in gewisser Weise die schönere Syntax hat.

Es enthält auch Klassen, mit denen gängige Transformationen modelliert werden können, die in Graphics and Vision häufig vorkommen, basierend auf Lie-Gruppen (Special Euclidean / Orthogonal in 2 und 3 Dimensionen usw.) und den zugehörigen Lie-Algebren.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.