MPI für multicore?
Mit der jüngsten Begeisterung über multicore-Programmierung ist, wer die Möglichkeiten der Verwendung von MPI ?
InformationsquelleAutor der Frage Bharani | 2008-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit der jüngsten Begeisterung über multicore-Programmierung ist, wer die Möglichkeiten der Verwendung von MPI ?
InformationsquelleAutor der Frage Bharani | 2008-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich verwendet habe, MPI ausgiebig auf großen Clustern mit multi-core-Knoten. Ich bin mir nicht sicher, ob es das richtige für einen einzigen multi-core-box, aber wenn Sie erwarten, dass Ihr code möglicherweise eines Tages Maßstab größer als ein single-chip, könnten Sie in Erwägung ziehen Implementierung in MPI. Jetzt, nichts Skalen größer als MPI. Ich bin mir nicht sicher, wo die Plakate, die Erwähnung inakzeptabel Gemeinkosten kommen aus, aber ich habe versucht, geben einen überblick über die relevanten Nachteile unten. Lesen Sie weiter für mehr.
MPI ist der de-facto-standard für große wissenschaftliche Berechnung, und es ist in breiten Einsatz auf multicore-Maschinen bereits. Es ist sehr schnell. Werfen Sie einen Blick auf die jüngsten Top-500-Liste. Die top-Maschinen auf, die Liste haben, in einigen Fällen Hunderte von tausenden von Prozessoren mit multi-socket-dual - und quad-core-Knoten. Viele dieser Maschinen sind sehr schnell, benutzerdefinierte Netzwerke (Torus, Mesh, Tree, etc.) und optimierte MPI-Implementierungen, die sich bewusst von der hardware.
Wenn Sie verwenden möchten MPI mit einem single-chip-multi-core-Maschine, es funktioniert gut. In der Tat, die jüngsten Versionen von Mac OS X kommen mit OpenMPI vorinstalliert, und Sie können herunterladen und installieren OpenMPI ziemlich schmerzfrei auf einem gewöhnlichen multi-core-Linux-Maschine. OpenMPI ist im Einsatz bei Los Alamos auf den meisten Ihrer Systeme. Livermore verwendet mvapich auf Ihre Linux-Clustern. Was Sie beachten sollten, bevor Sie Tauchen in, MPI entwickelt wurde, für die Lösung großer wissenschaftlicher Probleme auf distributed-memory - Systeme. Die multi-core-Boxen, die Sie zu tun haben wahrscheinlich shared memory.
OpenMPI und andere Implementierungen verwenden shared memory für die lokale message-passing standardmäßig, so dass Sie nicht haben, um sorgen über die Netzwerk-overhead, wenn Sie die Weitergabe von Nachrichten an lokale Prozesse. Es ist ziemlich transparent, und ich bin mir nicht sicher, wo die anderen Plakate werden immer Ihre Bedenken über den hohen Aufwand. Die Einschränkung ist, dass MPI ist nicht die einfachste Sache, die Sie verwenden könnten, um Parallelität auf einem einzigen multi-core-box. In MPI, alle die Nachricht ist eindeutig. Es wurde als "assembly-Sprache" der parallelen Programmierung aus diesem Grund. Explizite Kommunikation zwischen Prozessen ist nicht einfach, wenn Sie nicht ein erfahrener HPC person, und es gibt andere Paradigmen besser geeignet für shared memory (UPCOpenMPund schöne Sprachen wie Erlang ein paar zu nennen), dass Sie vielleicht zuerst versuchen.
Mein Rat ist, gehen Sie mit MPI-wenn Sie erwarten, schreiben eine parallele Anwendung, benötigen möglicherweise mehr als eine einzige Maschine zu lösen. Sie werden in der Lage sein zu testen und laufen problemlos mit einem normalen multi-core-box, und die Migration zu einem cluster wird ziemlich schmerzlos, wenn Sie es bekommen, die dort arbeiten. Wenn Sie eine Anwendung schreiben, die nur jemals brauchen, um eine einzelne Maschine, probieren Sie etwas anderes. Gibt es einfachere Möglichkeiten zu nutzen, die Art von Parallelität.
Schließlich, wenn Sie das Gefühl wirklich abenteuerlich, versuchen MPI in Verbindung mit threads, OpenMP, oder einige andere lokale shared-memory-Paradigma. Sie können MPI für verteilte message-passing-und etwas anderes für auf-node-Parallelisierung. Dies ist, wo große Maschinen gehen; die Zukunft die Maschinen mit Hunderten von tausenden von Prozessoren oder mehr zu erwarten sind, MPI-Implementierungen, dass die Skalierung für alle Knoten aber nicht alle Kerne, und die HPC-Menschen werden gezwungen sein, um hybride Anwendungen erstellen. Dies ist nicht für das schwache des Herzens, und es gibt eine Menge Arbeit getan werden, bevor es eine akzeptierte Paradigma, dass in diesem Raum.
InformationsquelleAutor der Antwort tgamblin
Ich würde Zustimmen, mit tgamblin. Sie haben wahrscheinlich Rollen Sie Ihre ärmel hoch und Graben in den code zu verwenden, MPI, explizit Handhabung der Organisation des message-passing-sich selbst. Wenn dies die Art von Sache, die Sie mögen oder don T Geist tun, würde ich erwarten, dass die MPI würde funktionieren genauso gut auf multicore-Maschinen, wie es wäre, auf einem verteilten cluster.
Sprechen aus eigener Erfahrung... ich codiert einige C-code in der graduate school zu tun, einige große Skala Modellierung von elektrophysiologischen Modelle auf einem cluster, in denen jeder Knoten selbst war eine multicore-Maschine. Daher gab es auch ein paar verschiedene parallele Methoden, die ich dachte, um das problem anzugehen.
1) die ich verwenden könnte, MPI, allein, die Behandlung von jedem Prozessor als seine eigene "Knoten", obwohl einige von Ihnen sind gruppiert zusammen auf der gleichen Maschine.
2) die ich verwenden könnte, MPI, Daten zu handhaben bewegen sich zwischen multicore-Knoten, und verwenden Sie dann einfädeln (POSIX-threads) innerhalb der einzelnen multicore-Maschine, wo Prozessoren, Speicher freigeben.
Für die spezifische mathematische problem, an dem ich arbeitete, getestet habe ich zwei Formulierungen, die das erste mal auf einem einzigen multicore-Maschine: mit einer MPI und einer mit POSIX-threads. Es stellte sich heraus, die MPI-Implementierung wurde viel mehr effizient, so dass Sie ein speed-up von nahezu 2 für eine dual-core-Gerät im Gegensatz zu 1.3-1.4 für die threaded-Implementierung. Für die MPI-code, ich war in der Lage zu organisieren, Vorgänge also, die Prozessoren waren selten Leerlauf, beschäftigt zu bleiben, während der Nachrichten zwischen Ihnen hindurch und Maskierung viel von der Verzögerung bei der übertragung von Daten. Mit den threaded code, landete ich mit einer Menge von mutex-Engpässe gezwungen, threads zu oft sitzen und zu warten, während andere threads beendeten Ihre Berechnungen. Halten die rechnerische Belastung ausgeglichen zwischen threads scheint nicht zu helfen, diese Tatsache.
Möglicherweise wurde diese spezielle, gerade die Modelle, die ich arbeiten war, und die Wirksamkeit von threading vs. MPI würde wahrscheinlich variieren stark für andere Typen von parallelen Probleme. Trotzdem würde ich widersprechen, der MPI hat einen unhandlichen overhead.
InformationsquelleAutor der Antwort gnovice
Nein, meiner Meinung nach ist es ungeeignet für die meisten der Verarbeitung, die Sie tun würde, die auf einem multicore-system. Der Aufwand ist zu hoch, die Objekte, die Sie passieren um muss tief geklont, und vorbei an großen Objekten, Grafiken herum, um dann führen Sie eine sehr kleine Berechnung ist sehr ineffizient. Es ist wirklich gedacht für den Austausch von Daten zwischen separaten Prozessen, am häufigsten ausführen in separaten Speicher Leerzeichen, und meistens laufen lange Berechnungen.
Ein multicore-Prozessor ist ein shared-memory-Maschine, so gibt es viel effizientere Wege, um die parallele Verarbeitung, die nicht mit kopieren von Objekten und wo die meisten threads laufen für eine sehr kleine Zeit. Zum Beispiel, denken Sie an eine Multithread-Quicksort. Der overhead der allokierung von Speicher und kopieren der Daten in einen thread, bevor es untergliedert wird viel langsamer mit MPI und eine unbegrenzte Anzahl von Prozessoren als Quicksort läuft auf einem einzigen Prozessor ausgeführt werden.
Als ein Beispiel in Java würde ich eine BlockingQueue (ein shared-memory-Konstrukt), übergeben Objekt Referenzen zwischen threads, mit sehr wenig Aufwand.
Nicht, dass es nicht seinen Platz haben, siehe zum Beispiel die Google-Suchmaschine, die verwendet message passing. Aber es ist wohl nicht das problem, das Sie lösen möchten.
InformationsquelleAutor der Antwort Tony BenBrahim
MPI ist nicht ineffizient. Sie brauchen, um zu brechen, das problem in Teile zerlegt und pass die Stücke, um und neu organisieren, wenn das Ergebnis fertig ist pro Stück. Niemand im rechten Sinn bestehen würde, um das gesamte Objekt über MPI, wenn nur ein Teil des Problems gearbeitet wird pro thread. Das ist aber nicht die Ineffizienz des interface oder design-Muster, das ist die Ineffizienz der Programmierer wissen, wie zu brechen ein problem.
Wenn Sie einen locking-Mechanismus, der overhead auf den mutex nicht gut skalieren. dies ist aufgrund der Tatsache, dass die Unterstreichung runqueue nicht wissen, wenn Sie gehen, um es zu sperren thread weiter. Führen Sie mehrere kernel-level-Prügel mit mutex ist als ein message-passing-design-Muster.
InformationsquelleAutor der Antwort Signal9
MPI hat eine sehr große Menge von overhead, in Erster Linie zu behandeln, inter-Prozess-Kommunikation und heterogenen Systemen. Ich habe es in Fällen, in denen eine kleine Menge von Daten übergeben wird, und wobei das Verhältnis von Berechnung zu Daten ist groß.
Dies ist nicht das typische Szenario für den Einsatz für die meisten consumer-oder business-Aufgaben, und in jedem Fall, wie in der vorherigen Antwort erwähnt, auf eine shared-memory-Architekturen wie multicore-Maschine, es gibt weitaus schnellere Wege, es zu handhaben, wie Speicher-Zeiger.
Wenn Sie hatte eine Art von problem mit den Eigenschaften oben beschreiben, und Sie wollen in der Lage sein, zu verbreiten, die Arbeit um zu anderen Maschinen, die müssen auf der gleichen Hochgeschwindigkeitsnetzwerk wie dich selbst, dann vielleicht MPI könnte Sinn machen. Ich habe eine harte Zeit vorzustellen, ein solches Szenario obwohl.
InformationsquelleAutor der Antwort Jan
Habe ich persönlich aufgenommen Erlang( und ich mag so weit). Der Nachrichten-basierte Ansatz zu passen scheinen die meisten das problem und ich denke, dass wird einer der Schlüssel-item für multi-core-Programmierung. Ich wusste nie über den overhead von MPI und vielen Dank für den Hinweis it out
InformationsquelleAutor der Antwort Bharani
Müssen Sie entscheiden, wenn Sie möchten, dass low-level-threading-oder high-level-threading. Wenn Sie möchten, low level, dann verwenden Sie pThread. Sie müssen vorsichtig sein, dass Sie sich nicht vorstellen, race-conditions und machen threading-performance gegen Sie arbeiten.
Ich habe einige OSS-Pakete für C und C++), sind skalierbar und optimieren die Terminplanung. TBB (threading building blocks) und Cilk Plus sind gut und einfach zu code und Anwendungen erhalten, die von dem Boden. Ich glaube auch, dass Sie ausreichend flexibel sind, integrieren andere thread Technologien in die it zu einem späteren Zeitpunkt, wenn nötig (OpenMP usw.)
http://www.threadingbuildingblocks.org
http://www.cilkplus.org
InformationsquelleAutor der Antwort Eugene Roeder