Welchen Algorithmus für die parallele dichte Matrixinversion auf höchstens 8 Kernen verwenden?

8

Ich muss eine parallele dichte Matrixinversion für eine Sprache implementieren, die ich verwende und für die anscheinend keine Bibliothek vorhanden ist (insbesondere IDL mit IDL Bridge für die Nachrichtenübermittlung). Ich bin mit parallelen Programmiermethoden durch Erfahrung mit MPI in C ++ vertraut, allerdings hauptsächlich für parallele FFT- und N-Body-Methoden. Ich habe wenig Erfahrung oder Kenntnisse über serielle oder parallele Berechnungsmethoden für die lineare Algebra.

Was ich suche, ist eine klare Pseudocode-Beschreibung eines robusten, stabilen Parallelmatrix-Inversionsalgorithmus, der für eine kleine Anzahl von Kernen geeignet ist, da der Computer, auf dem die (derzeit serielle) IDL-Task ausgeführt wird, 8 Kerne hat. In der Praxis werde ich wahrscheinlich nur 4 verwenden, um die Kerne für andere Aufgaben frei zu halten.

Ich würde die Einfachheit der neuesten Leistung vorziehen, wenn es eine Reihe bekannter Algorithmen für diese Aufgabe gibt.

Bogdanovist
quelle
1
Ich nehme an, Sie meinen dichte Matrizen. Sicherlich können Sie IDL dazu bringen, bei Bedarf eine Thread-Implementierung von LAPACK (z. B. MKL oder sogar ATLAS) zu verwenden LD_PRELOAD.
Jed Brown
Ja danke, ich bin nach einem dichten Matrixalgorithmus. Ich habe das jetzt in der Frage klargestellt. Ich werde Threaded-LAPACK-Implementierungen untersuchen, wie Sie vorschlagen. Das wäre wenn möglich vorzuziehen. Danke für den Zeiger.
Bogdanovist
IDL verfügt seit mindestens 3 oder 4 Jahren über Multithread-Bibliotheken für lineare Algebra. Ich glaube, dass LA_INVERT auf jeder neueren Version von IDL Multithreading ausführen wird. Beachten Sie, dass es einen Konfigurationsschalter gibt, der steuert, wie viele Threads verfügbar sind (und wahrscheinlich standardmäßig auf Single-Thread eingestellt ist)
Brian Borchers
Danke Brian. Ich habe die Dokumentation von IDL7 und IDL8 überprüft und schlage auch nicht vor, dass LA_INVERT den Thread-Pool verwendet. Ich habe auch getestet, dass, wenn ich IDL so einstelle, dass große Matrizen für eine Weile invertiert werden, nur 1 der 8 Kerne verwendet wird (laut meinem Systemmonitor). Ich habe überprüft, dass die Einstellungen von! CPU und TPOOL_NTHREADS gleich HW_NCPU sind, was laut Dokumentation bedeutet, dass Thread-Routinen so viele Kerne verwenden sollten, wie physisch verfügbar sind. Ich habe auch versucht, TPOOL_MIN_ELTS zu reduzieren, um Multithreading in LA_INVERT ohne Glück zu erzwingen. Noch mehr Ideen?
Bogdanovist
Wie groß sind deine Matrizen? IDL verwendet kein Multithreading, es sei denn, die Matrizen sind groß genug. Wenn Sie zu kleine Matrizen haben (z. B. weniger als N = 1000), bietet Multithreading keine Leistungsvorteile, und IDL verwendet die Multithread-Routinen nicht. Es gibt auch Konfigurationseinstellungen für diesen Cutoff. Ich habe IDL seit einigen Jahren nicht mehr verwendet, aber ich bin wirklich überrascht, dass dies bei Ihnen nicht funktioniert. Ich würde vorschlagen, in einem IDL-spezifischen Forum nachzufragen. Das comp.lang.idl = pvwave-Usenet ist ein guter Ort, um nachzuschauen.
Brian Borchers

Antworten:

5

Anstatt Ihre eigenen zu rollen, würde ich vorschlagen, dass Sie sich vorhandene robuste und effiziente parallele Implementierungen wie PLASMA ansehen .

Wenn Sie nur nach Algorithmen suchen, die Sie selbst implementieren können, werden die meisten Routinen im Abschnitt "Dokumentation" dieser Site übermäßig dokumentiert.

Pedro
quelle