Konvertieren der linearen gsl-Algebra zur Verwendung in Scalapack oder anderen parallelen Matrixbibliotheken

StackOverflow https://stackoverflow.com/questions/9386113

  •  28-10-2019
  •  | 
  •  

Frage

Ich habe einen Code, der tief in die Matrixarithmetik der GNU Scientific Library (GSL) eingebettet ist. Die Hauptberechnung dieses Codes besteht darin, ein großes System linearer Gleichungen zu lösen, das seriell sehr lange dauert und mit GSL- und BLAS-Funktionen vorhanden isteine Möglichkeit, diese Berechnung zu parallelisieren oder für die Verwendung in einer bereits parallelen Bibliothek wie ScaLAPACK zu konvertieren?

War es hilfreich?

Lösung

Wenn Ihre Matrix spärlich ist, d. h. viele Null-Einträge enthält, können Sie problemlos viele spärliche Matrix-Algebra-Pakete ohne allzu große Probleme implementieren. Leider müssen Sie Ihre Matrizen in einem spärlichen Format speichern, was meines Wissens gsl nicht tut. Sobald Sie Ihre Matrix in einem spärlichen Format gespeichert haben, sollten Sie in der Lage sein, große Systeme auch in seriellen Anwendungen ohne allzu große Probleme zu handhaben.

Ich schlage vor, UMFPACK zu verwenden, da die Implementierung den geringsten Arbeitsaufwand erfordert, da Sie Ihre Daten nicht in ihre Strukturen einfügen müssen.

Ein Hinweis zum Paralleismus: Wenn Ihr Code derzeit seriell ist, ist es NICHT trivial, zu einem parallelen Löser zu wechseln. Es ist möglich, dass es einfach ist, ein Multithread-Paket zu implementieren, aber ich habe nicht viel Erfahrung mit Thread-Programmen. Darüber hinaus sind wirklich parallele (verteilte Speicher-) Direktlöser nicht allzu effizient, da jeder Prozessor eine eigene Kopie der vollständigen Matrix benötigt und es besser ist, iterative Methoden zu verwenden.

Ein bisschen mehr Detail wäre hilfreich: Wie lange ist eine lange Zeit? Benötigen Sie aus irgendeinem Grund die Umkehrung oder lösen Sie nur ein Gleichungssystem?

Andere Tipps

Haben Sie Intel MKL ausprobiert?Es enthält seine eigenen parallelen Versionen der Blas-Funktionen.Als ich es das letzte Mal versucht habe, sind sie verdammt schnell.Es wäre aber auch einfacher zu beantworten, wenn Sie Informationen zur Größe der Matrix angeben würden. Solange Sie jedoch x64, viele CPUs / Kerne und viel RAM ausführen, spielt dies keine Rolle.

Eine weitere Option ist nVidia CUDA.Ihre Schnittstelle ähnelt blas, ist aber tatsächlich langsamer als MKL, immer noch schneller als seriell.Könnte sein, dass ich es auf einer alten Karte versucht habe, aber Sie benötigen mindestens 200 GPU-Stream-Einheiten, um es als nützlich zu bezeichnen.

BEARBEITEN: Matrizen dieser Größen liegen außerhalb meiner Erfahrung.

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