Anleitungen zu Python für die parallele Programmierung mit gemeinsamem Speicher

11

Ich habe Erfahrung in der Codierung von OpenMP für Shared Memory-Maschinen (sowohl in C als auch in FORTRAN), um einfache Aufgaben wie Matrixaddition, Multiplikation usw. auszuführen (nur um zu sehen, wie es mit LAPACK konkurriert). Ich kenne OpenMP genug, um einfache Aufgaben auszuführen, ohne die Dokumentation lesen zu müssen.

Kürzlich bin ich für meine Projekte zu Python gewechselt und habe keine Erfahrung mit Python, die über die absoluten Grundlagen hinausgeht.

Ich habe 2 Fragen:

  • Gibt es eine gute Anleitung (Online-PDF) zur Beschreibung des Shared Memory Parallel Computing für Python?

  • Was ist der beste Weg, um dies zu erreichen? Ich habe ein bisschen gesehen ctypesund bin mir nicht sicher, ob das der beste Weg ist. (Am besten meine ich eine, die einen guten Kompromiss zwischen Programmiererzeit und Systemzeit aufweist. Das Codieren sollte nicht zu langweilig sein, und die Ausführung sollte nicht langsam sein.)

Anfrage
quelle

Antworten:

8

[Dies ist mein erster Beitrag und ich hoffe, ich habe die Verwendung von SE nicht völlig missverstanden - wenn ja, entschuldige ich mich im Voraus]

Ich stimme "bgschaid" zu, dass die Frage aufgrund der bereitgestellten Informationen sehr schwer zu beantworten ist. Es macht einen großen Unterschied, ob Sie möchten, dass Routinen auf niedriger Ebene eine Multi-Core-Architektur ausnutzen, oder ob Sie Parallelität für peinlich parallele Probleme ausnutzen müssen - oder etwas dazwischen. Eine Übersicht über verschiedene parallele Rechenmöglichkeiten in Python finden Sie hier .

Im ersteren Fall empfehle ich auf jeden Fall, Tools wie NumPy / SciPy zu verwenden, die zumindest in der von Enthought kompilierten MKL-Version Multi-Core-Architekturen unterstützen. Hier können Sie die Anzahl der zu verwendenden Kerne über die Umgebungsvariable "MKL_NUM_THREADS" steuern. Dies beruht auf hochoptimierten Bibliotheken, von denen wir kaum erwarten können, dass sie die Leistung übertreffen. Ich glaube, es wird allgemein empfohlen, diese hochwertigen und hochoptimierten Bibliotheken nach Möglichkeit zu verwenden.

Wenn Sie auf einer groben Ebene nutzen Parallelität wollen, der Python Standard - Tool Multiprocessing ist einfach zu bedienen - und es unterstützt auch gemeinsam genutzte Datenobjekte. Im Rahmen des Multiprocessing- Pakets stehen verschiedene Tools zur Verfügung . Ich habe map_async (SIMD like) und apply_async (MIMD like) für mehrere Probleme mit guten Ergebnissen verwendet. Das Multiprocessing- Paket ist recht einfach zu verwenden. Da es ein Standardbestandteil von Python ist, können Sie davon ausgehen, dass andere potenzielle Benutzer Ihres Codes es problemlos verwenden können. Multiprocessing verknüpft auch direkt mit NumPy-Datenobjekten. Bei Verwendung von MultiprocessingIch würde Ihnen empfehlen, die Umgebungsvariable "MKL_NUM_THREADS" auf 1 zu setzen, sodass NumPy nur einen Kern für jeden Prozess / Worker zulässt. Andernfalls kann es zu einem Ressourcenkonflikt zwischen NumPy parallel und Multiprocessing kommen, der zu einer Leistungsverschlechterung führt. Multiprocessing funktioniert gut für eine Multi-CPU / Multi-Core-Architektur unter demselben Betriebssystem. Ich habe Multiprocessing auf einem Computer mit gemeinsamem Speicher mit 4 x Xeon E7-4850-CPUs (jeweils 10 Kerne) und 512 GB Speicher verwendet und es hat sehr gut funktioniert. Freigegebene Arrays können durch Multiprocessing.Array oder Sharedctypes verarbeitet werden . Die Python-Dokumentation finden Sie hier - überprüfen Sie dielibrary.pdf Datei. Ich habe einige Folien, die einige der grundlegenden Teile davon erklären - PM mich, wenn Sie diese wollen.

Wenn Sie eine Cluster-Konfiguration mit verteiltem Speicher haben, ist mpi4py wahrscheinlich das bevorzugte Tool. Ich habe dies selbst nicht verwendet, aber ich weiß, dass es in der parallelen Python-Programmierung häufig verwendet wird.

Lars1
quelle
3

Dies hängt von der Ebene ab, die Sie parallel programmieren möchten. Zum Beispiel für Matrix- / Vektor-Inhalte wäre der erste Stopp mit Python NumPy / SciPy (sie bieten eine Schnittstelle zu numerischen Bibliotheken, die Ihnen die volle Geschwindigkeit der Bibliotheken mit dem Komfort von Python bietet), und nach dem, was sie über Parallelität schreiben , scheint es so Wenn die Bibliotheken für die parallele Verwendung kompiliert werden, nutzen die Programme für bestimmte Operationen Multicores. (Dieser Artikel scheint etwas älter zu sein. In der Zwischenzeit haben sich die Dinge möglicherweise verbessert. Außerdem gibt es Links zu anderen Methoden der parallelen Programmierung.

Und natürlich gibt es mpi4py , um MPI direkt zu programmieren (im obigen Artikel enthalten).

Mein Fazit lautet: Wenn Ihr Hauptinteresse Vektor- / Matrixoperationen sind und Parallelität etwas ist, das Sie "nur" schnell erledigen müssen, sollten Sie sich das NumPy / SciPy-Ökosystem ansehen und nur dann, wenn Sie das nicht finden Dinge, die Sie brauchen, wenn Sie Ihre eigenen Bibliotheken schreiben möchten

bgschaid
quelle