Frage

Ich bin eine Software für hyperbolische partielle Differentialgleichungen in C ++ zu schreiben. Fast alle Bezeichnungen sind Vektor- und Matrix diejenigen. Hinzu kommt, dass, ich brauche die lineare Algebra Löser. Und ja, der Vektor und die Größen der Matrix können erheblich variieren (von etwa 1000 bis Größen, die nur von verteiltem Speicher Computing gelöst werden können, z. B. Cluster oder ein ähnliche Architektur). Wenn ich in Utopie gelebt hatte, würde ich hatte lineare Solver hat, die für Cluster, GPUs und Multicores großen skaliert werden kann.

Wenn man über die Datenstruktur zu denken, die die Variablen repräsentieren sollte, kam ich accros die boost.ublas und MTL4. Beide Bibliotheken sind blas Level 3 kompatibel, MTL4 implementiert Sparse Solver und ist viel schneller als ublas. Beide haben keine Unterstützung für Multi-Core-Prozessoren implementiert, ganz zu schweigen von Parallelisierung für verteilte Speicher Berechnungen. Auf der anderen Seite hängt die Entwicklung von MTL4 auf alleinige Anstrengung von 2 Entwicklern (zumindest als ich verstand), und ich bin sicher, dass ein Grund gibt es, dass die ublas in der Boost-Bibliothek ist. Darüber hinaus enthält mkl Bibliothek Intel das Beispiel für ihre Struktur mit ublas verbindlich. Ich möchte meine Daten und Software auf die Datenstruktur binden, die felsenfest wird, entwickelt und für längere Zeit beibehalten.

Schließlich ist die Frage. Was ist Ihre Erfahrung mit dem Einsatz von ublas und / oder MTL4, und was würden Sie empfehlen?

Danke, mightydodol

War es hilfreich?

Lösung

Mit Ihren Anforderungen entsprechen, würde ich wahrscheinlich gehen boost :: uBLAS . Tatsächlich sollte etwa auf dem Niveau MTL4 in Bezug auf Geschwindigkeit ein guter Einsatz von uBLAS sein.

Der Grund dafür ist, dass es existiert Bindungen ATLAS (daher Shared-Memory-Parallelisierung, die Sie effizient für Ihren Computer optimieren können), und auch hersteller abgestimmt Implementierungen wie die Intel Math Kernel Library oder HP MLIB .

Mit diesen Bindungen, uBLAS mit einer gut abgestimmten ATLAS / BLAS-Bibliothek, die Mathematik zu tun sollte schnell genug sein. Wenn Sie BLAS / ATLAS angegebenen Link gegen einen, sollten Sie etwa auf dem Niveau MTL4 gegen die gleichen BLAS / ATLAS verbunden sein, um die Compiler-Flag mit -DMTL_HAS_BLAS , und wahrscheinlich schneller als die MTL4 ohne BLAS nach eigenem Beobachtung (Beispiel siehe hier , wo GotoBLAS trifft MTL4).

Um es zusammenzufassen, Geschwindigkeit sollte Ihr entscheidender Faktor nicht, solange Sie bereit sind, einige BLAS-Bibliothek zu verwenden. Benutzerfreundlichkeit und Unterstützung ist wichtiger. Sie müssen entscheiden, ob MTL oder uBLAS besser für Sie geeignet ist. Ich neige dazu, in Richtung uBLAS gegeben, dass es Teil BOOST ist, und MTL4 unterstützt derzeit nur BLAS selektiv . Vielleicht haben Sie auch diese etwas veraltet Vergleich wissenschaftlicher C finden ++ Pakete interessant .

Ein großes ABER: für Ihre Anforderungen (extrem große Matrizen), würde ich wahrscheinlich die „syntaktische Zucker“ uBLAS oder MTL überspringen, und rufen Sie das „Metall“ C-Schnittstelle von BLAS / LAPACK direkt. Aber das ist nur meine Meinung ... Ein weiterer Vorteil ist, dass es einfacher sein sollte als wechseln Scalapack (distributed Speicher LAPACK, habe es nie größere Probleme). Nur um klar zu sein:. Für Haus-halten Probleme, ich würde nicht vorschlagen, direkt eine BLAS-Bibliothek aufrufen

Andere Tipps

Wenn Sie die Programmierung Vektoren, Matrizen und lineare Algebra in C ++, ich bei Eigen aussehen würde:

http://eigen.tuxfamily.org/

Es ist schneller als uBLAS (nicht sicher MTL4) und viel sauberer Syntax.

Für neue Projekte, ist es wahrscheinlich am besten weg von uBlas von Boost zu bleiben. Der uBlas FAQ hat auch diese Warnung seit Ende 2012:

F: Soll ich uBLAS für neue Projekte?    ... war die letzte große Verbesserung der uBLAS im Jahr 2008 und keine wesentliche Änderung seit 2009 ... Leistung begangen wurde? Es gibt schnellere Alternativen. Innovativ, auf dem neuesten Stand? uBLAS ist mehr als 10 Jahre alt und verpassten alle neuen Sachen von C ++ 11.

Es ist eine C ++ Bibliothek in dieser Liste fehlt: FLENS

http://flens.sf.net

Disclaimer: Ja, das ist mein Baby

  • Es ist nur Header
  • Kommt mit einer einfachen, nicht-performanten, generischen (d Templat) C ++ Referenz Implemenation von BLAS.
  • Falls vorhanden können Sie eine optimierte BLAS Implementierung als Backend verwenden. In diesem Fall seiner wie mit BLAS direkt ( einig Benchmark soll ich aktualisieren ).
  • Sie können mit überladenen Operatoren statt Aufruf BLAS-Funktionen .
  • Er kommt mit seiner eigenen, eigenständigen, generischen Wieder Implemenation eines Bündel von LAPACK Funktionen. Wir nennen diesen Port FLENS-LAPACK .
  • FLENS-LAPACK hat genau die gleiche Genauigkeit und Leistung als Netlib des LAPACK. Und nach meiner Erfahrung (FLENS-) LAPACK + ATLAS oder (FLENS-) LAPACK + OpenBLAS gibt Ihnen die gleiche Leistung wie ACML oder MKL.
  • FLENS hat eine andere Politik die Schaffung von temporärem Vektor / Matrizen in der Auswertung der linearen Algebra Ausdrücke in Bezug auf. Die FLENS Politik ist: Nie sie schaffen !!!. Jedoch in einem spezielle Debug-Modus wir erlauben die Erstellung von Provisorien „wenn nötig“. Dieses „wenn nötig“ Politik Sache ist die Standardeinstellung in anderen Bibliotheken wie Eigen oder Armadillo oder in Matlab.

Sie können die Leistungsunterschiede sehen direkt hier: http://www.osl.iu.edu/research/ mtl / MTL4 / doc / performance.php3

Beide sind vernünftige Bibliotheken hinsichtlich ihrer Schnittstellen zu verwenden, ich glaube nicht, dass da uBLAS durch den BOOST-Review-Prozess bekam unbedingt seinen Weg robuster. Ich habe meinen Anteil an Alpträumen mit nicht offensichtlichen Nebenwirkungen und unerwünschten Folgen von uBLAS Implementierungen habe.

Das ist nicht zu sagen uBLAS schlecht ist, es ist wirklich gut, aber ich denke, in diesen Tagen die dramatischen Aufführungen Unterschiede für MTL gegeben, es lohnt sich statt uBLAS mit, obwohl es wohl ein bisschen riskanter becuase es „nur 2 Entwickler "Selbsthilfegruppe.

Am Ende des Tages geht es um Geschwindigkeit mit einer Matrix-Bibliothek, geht mit MTL4.

Aus meiner eigenen Erfahrung ist MTL4 viel schneller als uBLAS und es ist auch schneller als Eigen.

Es gibt eine parallele Version von MTL4. Schauen Sie einfach unter Simunova

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top