Warum wird MPI härter als Shared Memory und Erlang als einfacher, wenn sie beide Message-Passing sind?

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

Frage

Es gibt ein großes Interesse in diesen Tagen in Erlang als Sprache für parallele Programme auf Multi-Core-Schreiben. Ich habe gehört, wie Leute argumentieren, dass Erlang Message-Passing-Modell ist einfacher zu programmieren als die dominanten Shared-Memory-Modelle wie Threads.

Im Gegensatz dazu in der High-Performance-Computing-Community die dominierende Parallele Programmierung hat MPI gewesen, die auch ein Message-Passing implementiert Modell. Aber in der HPC-Welt, dieses Message-Passing-Modell in der Regel sehr schwierig angesehen wird programmiert in, und die Leute argumentieren, dass Shared-Memory-Modelle wie OpenMP oder UPC sind einfacher zu programmieren.

Weiß jemand, warum es solch ein Unterschied in der Wahrnehmung der Message-Passing ist gegenüber Shared Memory in den IT- und HPC Welten? Ist es aufgrund einiger grundlegender Unterschied, wie Erlang und MPI Message Passing implementieren, die Erlang-Stil Message-Passing viel einfacher als MPI macht? Oder gibt es einen anderen Grund?

War es hilfreich?

Lösung

Ich stimme mit allen bisherigen Antworten, aber ich denke, ein wichtiger Punkt, der nicht ganz klar ist, ist, dass ein Grund, dass MPI hart angesehen werden könnte und Erlang einfach das Spiel von Modell der Domäne ist.

ist Erlang basiert auf einem Konzept des lokalen Speichers, asynchrone Message-Passing und gemeinsam genutzten Zustand gelöst, indem eine Form der globalen Datenbank, die alle Threads zu bekommen. Es ist für Anwendungen, die nicht um eine ganze Reihe von Daten bewegen, und das ist nicht auf einen 100k getrennten Knoten zu explodieren soll, die Koordination benötigen.

MPI basiert auf lokalen Speicher und Message-Passing und ist für Probleme gedacht, in denen Daten bewegen ein wichtiger Teil der Domäne ist. High-Performance-Computing ist sehr viel über den Datensatz für ein Problem, nehmen und es bis unter einer Vielzahl von Rechenressourcen zu splitten. Und das ist ziemlich harte Arbeit in einem Message-Passing-System als Daten explizit mit Ausgleich im Auge verteilt werden muss. Im Wesentlichen kann MPI als grudging Aufnahme betrachtet werden, die die gemeinsamen Speicher nicht skaliert wird. Und es zielt auf High-Performance-Berechnung verteilt auf 100k Prozessoren oder mehr.

Erlang versucht nicht, die höchstmögliche Leistung zu erzielen, sondern ein natürlich parallel Problem in seine natürlichen Fäden zu zersetzen. Es wurde mit einer ganz anderen Art von Programmieraufgaben im Auge im Vergleich zu MPI entwickelt.

So Erlang wird am besten im Vergleich zu pthreads und anderen eher lokalen heterogenen Thread Lösungen, statt MPI, die wirklich auf ein ganz andere richten (und zu einem gewissen Grad von Natur aus schwerer) Problem eingestellt.

Andere Tipps

Parallelismus in Erlang noch ziemlich schwer zu implementieren. Damit meine ich, dass Sie noch herausfinden müssen, wie Ihr Problem zu spalten, aber es gibt ein paar kleine Dinge, die diese Schwierigkeit erleichtern, wenn zu einem gewissen MPI-Bibliothek in C oder C ++ verglichen.

Erstens, da Erlang Message-Passing eine First-Class-Sprache-Funktion ist, der syntaktische Zucker macht es leichter fühlen.

Auch Erlang-Bibliotheken sind alle um Erlang Message Passing gebaut. Diese Trägerstruktur hilft geben Ihnen einen Schub in Parallel processling Land. Werfen Sie einen Blick auf die Komponenten von OTP wie gen_server, gen_fsm, gen_event. Diese sind sehr leicht Strukturen zu verwenden, die Ihr Programm wird parallel helfen.

Ich denke, es ist mehr die Robustheit der verfügbaren Standard-Bibliothek, die erlang die Message-Passing von anderen MPI-Implementierungen, nicht wirklich eine bestimmte Funktion der Sprache selbst unterscheidet.

In der Regel Gleichzeitigkeit in HPC bedeutet Arbeit an großen Datenmengen. Diese Art von Parallelität Datenparallelismus genannt und ist in der Tat einfacher, einen Shared-Memory-Ansatz wie OpenMP zur Umsetzung mit , da das Betriebssystem sich um Dinge wie Planung und Platzierung von Aufgaben übernimmt, die man hätte sich implementieren, wenn eine Message-Passing-Paradigma.

Im Gegensatz dazu wurde Erlang entworfen mit Aufgabe Parallelität zu bewältigen in Telefonsystemen angetroffen, in denen verschiedenen Teile des Codes sind nur mit einer begrenzten Menge an Kommunikation und starken Anforderungen an Fehlertoleranz und Wiederherstellung ausgeführt gleichzeitig werden.

Dieses Modell ist ähnlich dem, was die meisten Leute benutzen PThreads für. Sie paßt Anwendungen wie Web-Server, wobei jede Anfrage von einem anderen Thread verarbeitet werden kann, während HPC-Anwendungen auf große Datenmengen so ziemlich das gleiche tun, die auch zwischen den Arbeitnehmern ausgetauscht werden müssen.

Ich denke, es hat etwas mit dem Mind-Set zu tun, wenn Sie mit MPI sind die Programmierung und wenn Sie mit Erlang sind zu programmieren. Zum Beispiel wird MPI nicht eingebaut in die Sprache während Erlang hat eingebaute Unterstützung für Message-Passing. Ein weiterer möglicher Grund ist die Trennung zwischen lediglich dem Senden / Empfangen von Nachrichten und Partitionieren Lösungen in parallele Einheiten der Ausführung.

Mit Erlang sind Sie gezwungen, in einem funktionalen Programmierung Rahmen zu denken, wo die Daten tatsächlich durch Reißverschluss von Funktionsaufruf Anruf funktionieren - und Empfang ist eine aktive Handlung, die in der Sprache wie ein normales Konstrukt aussieht. Dies gibt Ihnen eine engere Verbindung zwischen der Berechnung Sie tatsächlich durchführen und den Akt des Senden / Empfangen von Nachrichten.

Mit MPI auf der anderen Seite sind Sie gezwungen, nur über die eigentliche Nachricht denken vorbei, aber nicht wirklich die Zersetzung der Arbeit. Dieser Rahmen des Denkens erfordert etwas von einem Kontextwechsel zwischen der Lösung und der Messaging-Infrastruktur in Ihrem Code zu schreiben.

Die Diskussion weitergehen kann, aber die gemeinsame Ansicht ist, dass, wenn das Konstrukt für Message Passing tatsächlich in die Programmiersprache gebaut und Paradigma, das Sie verwenden, in der Regel, dass ein besseres Mittel, um die Lösung zum Ausdruck im Vergleich zu etwas anderes, das ist „geheftet“ oder existiert als Add-on zu einer Sprache (in Form einer Bibliothek oder Erweiterung).

  

Weiß jemand, warum es solch ein Unterschied in der Wahrnehmung der Message-Passing ist gegenüber Shared Memory in den IT- und HPC Welten? Ist es aufgrund einiger grundlegender Unterschied, wie Erlang und MPI Message Passing implementieren, die Erlang-Stil Message-Passing viel einfacher als MPI macht? Oder gibt es einen anderen Grund?

Der Grund dafür ist einfach Parallelität vs Gleichzeitigkeit. Erlang ist für die gleichzeitige Programmierung gezüchtet. HPC ist über die parallele Programmierung. Diese beziehen sich jedoch unterschiedliche Ziele.

Concurrent Programmierung wird durch stark nicht-deterministischen Steuerfluss und die Latenzzeit ist oft ein wichtiges Ziel sehr kompliziert. Erlang Verwendung von unveränderlichen Datenstrukturen vereinfacht die parallele Programmierung.

Parallel-Programmierung hat viel einfachen Steuerungsablauf und das Ziel ist, alles um maximalen Gesamtdurchsatz und nicht die Latenz. Effiziente Cache-Nutzung ist viel wichtiger, hier, die sowohl Erlang und unveränderliche Datenstrukturen weitgehend ungeeignet macht. Mutieren Shared Memory ist sowohl lenkbar und wesentlich besser in diesem Zusammenhang. In der Tat stellt die Cache-Kohärenz hardwarebeschleunigte Nachricht für Sie übergeben.

Schließlich, zusätzlich zu diesen technischen Unterschiede gibt es auch eine politische Frage. Die Erlang Jungs versuchen, den Multi-Core-Hype zu fahren, indem er vorgibt, dass Erlang relevant ist auf Multicore, wenn es nicht ist. Insbesondere sind touting sie große Skalierbarkeit, so dass es eine absolute Performance zu betrachten und wesentlich ist. Erlang skaliert mühelos aus armen absoluten Performance auf einem Kern zu einer schlechten absoluten Performance auf einer beliebigen Anzahl von Kernen. Wie man sich vorstellen kann, ist, dass nicht die HPC Community beeindrucken (aber es ist ausreichend für viele stark gleichzeitigen Code).

In Bezug auf MPI vs OpenMP / UPC: MPI zwingt Sie dazu, das Problem in kleine Stücke schneiden und übernehmen die Verantwortung für die Daten um zu bewegen. Mit OpenMP / UPC, „alle Daten ist es“, müssen Sie nur noch zu dereferenzieren einen Zeiger. Der MPI Vorteil ist, dass 32 bis 512 CPU-Cluster sind viel billiger als 32-512 CPU einzelne Maschinen. Auch mit MPI der Aufwand im Voraus, wenn Sie den Algorithmus entwerfen. OpenMP / UPC kann die Latenzen verstecken, die Sie zur Laufzeit erhalten werden, wenn Ihr System NUMA verwendet (und alle großen Systeme tun.) - Ihr Programm wird nicht skaliert, und es wird eine Weile dauern, um herauszufinden, warum

In diesem Artikel explaines es eigentlich gut, Erlang am besten ist, wenn wir kleine Daten arround und MPI tut viel besser auf komplexere Dinge senden. Auch das Erlang-Modell ist leicht zu verstehen: -)

Erlang Versus MPI - Endgültige Ergebnisse und Source Code

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