2016-04-20 16 views
-2

Ich weiß, dass es viele Informationen zu diesem Thema gibt, aber ich habe Mühe, die beste Lösung für mein spezifisches Problem zu finden.Benötigen Sie Hilfe zum Lösen spärlicher Axe = b

Für mein Problem ist A extrem groß (~ 145k x 145k) und extrem spärlich (maximal 9 von Null verschiedene Werte pro Zeile). Es ist nicht positiv definit, noch symmetrisch und ist komplex bewertet (einfache Genauigkeit). Das Sparsity-Muster kann visualisiert werden, indem man sich eine tridiagonale Matrix vorstellt und dann zwei "Tridiagonale" über und unter dem N-Abstand von der Haupttridiagonale hinzufügt. Dies ergibt 3 Sätze von 3 Nicht-Nullen in jeder Reihe mit Mengen von 3, getrennt durch N (N ist für eine gegebene Matrix A konstant) und zentriert auf der Hauptdiagonalen. ~ 5% der Zeilen füllen aufgrund von Randbedingungen nicht alle 9 Nicht-Null-Positionen, daher haben diese Zeilen eine Untermenge des Hauptmusters ungleich Null.

Ich muss für mehrere rechte Seiten (~ 1024) lösen. Ich muss auch das gleiche System mit verschiedenen numerischen Werten in A lösen, aber das gleiche Sparsity-Muster. Zur Zeit verwende ich SuperLU (single threaded), um A zu LU zu faktorisieren und dann mit cusparse zu lösen (speziell cusparseCcsrsm_solve).

Ist ein spärlicher direkter Löser mit LU-Faktorisierung der beste Ansatz für mein Problem? Welche Bibliothek wäre die schnellste für die LU-Faktorisierung? Welches wäre am schnellsten für die Lösung mit Rückersatz?

+0

Versuchen Sie, die Frage weiter zu kondensieren; Es ist unklar, was du eigentlich fragst. – AlBlue

Antwort

1

In Bezug auf die schnellste in direkten Löser bin ich mehr auf MUMPS gelehnt. Die Bibliotheken, die die Hauptakteure sind und aktiv entwickelt werden (zumindest die, die ich kenne und benutzt habe) sind MUMPS, SuperLU, UMFPACK, SuiteSparse, Trilinos und PETSc.

Wenn ich dies tun würde, würde ich einen robusten iterativen Solver verwenden und ihn mit unvollständiger LU-Faktorisierung vorkonditionieren.

Es gibt eine sehr gut bekannte Faustregel zwischen Benutzern von iterativen Solver. Wenn Ihr System größer als 4x4 ist, müssen Sie einen iterativen Solver verwenden. Wenn Sie iterative Solver verwenden möchten, würde ich vorschlagen, Trilinos oder PETSc zu verwenden. Der Hauptunterschied besteht darin, dass der erstere objektorientiert ist und der spätere nicht. Es gibt nicht viel Leistungsunterschied zwischen ihnen.

Für GPU-Programmierung habe ich nicht genug Erfahrung. Ich benutzte einmal eine Bibliothek namens PARALUTION, die eine nette Bibliothek ist. Es verbirgt die GPU-Implementierung für Sie.

+0

Könnte ich fragen, warum Sie einen iterativen Solver verwenden würden? Könnte es wirklich in Bezug auf die Geschwindigkeit konkurrieren, da ich ~ 1024 rechte Seiten habe? Ich lehne Trilinos ab, da es eine gemeinsame Schnittstelle zu einigen verschiedenen iterativen und direkten Lösern bietet. Danke fürs Helfen! – user1777820

+0

Nun, die Iterationen von iterativen Lösern sind billig (O (N)), während sie für direkte Löser höher sind. Bei einem guten Preconditioner schlägt ein iterativer Solver einen direkten Solver. Wenn die Systemmatrix gut konditioniert ist, besteht die Möglichkeit, dass Sie die genaue (oder etwas sehr genaue) LU von Incomplete LU erhalten, und dann wird ein iterativer Solver in nur zwei Iterationen konvergieren. – Ashkan