Frage

Ich entwickle eine wissenschaftliche Anwendung verwendet, um physikalische Simulationen durchzuführen. Die verwendeten Algorithmen sind O (n3), so für eine große Menge von Daten es eine sehr lange Zeit in Anspruch nimmt zu verarbeiten. Die Anwendung läuft eine Simulation in etwa 17 Minuten, und ich habe auf rund 25.000 Simulationen. Das ist etwa ein Jahr an Verarbeitungszeit.

Die gute Nachricht ist, dass die Simulationen völlig unabhängig voneinander sind, so kann ich einfach das Programm ändern, um die Arbeit mit mehreren Computern zu verteilen.

Es gibt mehrere Lösungen Ich kann sehen, dies zu implementieren:

  • Holen Sie sich einen Multi-Core-Computer und verteilt die Arbeit unter allen Cores. Nicht genug für das, was ich tun muss.
  • Schreiben Sie eine Anwendung, die auf mehr „Verarbeitung“ Server und verteilt die Last unter ihnen verbindet.
  • ein Cluster von günstigen Linux Computer holen und haben das Programm alles als Einheit behandeln.

Option Nummer 2 ist relativ einfach zu implementieren, so dass ich sehe nicht so viel für Vorschläge, wie dies zu implementieren (kann nur durchgeführt werden, indem ein Programm zu schreiben, die für die Parameter auf einem bestimmten Port wartet, verarbeitet die Werte und gibt das Ergebnis als eine serialisierte Datei). Das wäre ein gutes Beispiel für Grid Computing .

Allerdings frage ich mich, auf die Möglichkeiten der letzten Option, einem traditionellen Cluster. Wie schwierig ist es, ein Java-Programm in einem Linux-Netz zu laufen? Werden alle separaten Computer als einen einzelnen Computer mit mehreren Kernen behandelt werden, so dass es so einfach, das Programm anzupassen? Gibt es eine gute Hinweise zu Ressourcen, die mir erlauben würde, um loszulegen? Oder ich mache dies zu kompliziert, und ich bin besser dran mit der Option Nummer 2?

EDIT: Als zusätzliche Info, ich bin interessiert, wie in diesem Artikel von Wired Magazine so etwas wie beschrieben implementieren: Scientific einen Supercomputer mit einer Playstation 3 linux-Cluster ersetzt. Definitiv Nummer zwei klingt wie die Art und Weise zu gehen ... aber der Coolness-Faktor.

EDIT 2: Die Berechnung ist sehr CPU-Bound. Grundsätzlich gibt es eine Menge von Operationen auf große Matrizes, wie inverse und Multiplikation. Ich habe versucht, für eine bessere Algorithmen für diese Operationen zu suchen, aber bisher habe ich festgestellt, dass die Operationen ich brauche sind 0 (n3) (In Bibliotheken, die normalerweise verfügbar sind). Der Datensatz ist groß (für solche Operationen), aber es wird auf der Grundlage der Eingabeparameter auf dem Client erstellt.


Ich sehe jetzt, dass ich ein Missverständnis hatte, wie ein Computer-Cluster unter Linux gearbeitet. Ich hatte die Annahme, dass es so funktionieren würde, es würde nur erscheinen, dass Sie in allen Computern verfügbar alle Prozessoren hatten, genauso wie wenn Sie einen Computer mit mehreren Kernen hatten, aber das scheint nicht der Fall zu sein. Es scheint, dass alle diese Supercomputer, indem Knoten arbeiten, die Aufgaben, die von einer zentralen Einheit verteilt auszuführen, und dass es mehr verschiedene Bibliotheken und Software-Pakete, die diese Verteilung leicht ausführen können.

Die Frage lautet also wirklich, denn es gibt nicht so etwas wie Nummer 3, in: Was ist der beste Weg, um eine Cluster-Java-Anwendung erstellen

War es hilfreich?

Lösung

würde ich sehr stark die Java-Parallel Processing Framework empfehlen vor allem, weil Ihre Berechnungen sind bereits unabhängig. Ich habe ein gutes Stück Arbeit mit diesem Bachelor und es funktioniert sehr gut. Die Arbeit der Umsetzung zu tun getan ist bereits für Sie so ich denke, das ist ein guter Weg, das Ziel in „Nummer 2“.

zu erreichen

http://www.jppf.org/

Andere Tipps

Nummer 3 ist nicht schwer zu tun. Es erfordert die Entwicklung zwei verschiedene Anwendungen, die Client und die Vorgesetzten. Der Kunde ist ziemlich viel, was Sie bereits, eine Anwendung, die eine Simulation ausgeführt wird. Allerdings muss es zu verändern, so dass es an den Supervisor verbindet unter Verwendung von TCP / IP oder was auch immer und fordert eine Reihe von Simulationsparametern. Es läuft dann die Simulation und sendet die Ergebnisse zurück an den Vorgesetzten. Der Supervisor auf Anfragen von den Kunden und für jede Anforderung, erhält eine nicht zugewiesene Simulation aus einer Datenbank und aktualisiert die Datenbank, der Punkt, um anzuzeigen, zugeordnet aber unvollendet. Wenn die Simulation abgeschlossen ist, aktualisiert der Supervisor die Datenbank mit dem Ergebnis. Wenn der Supervisor die Daten in einer aktuellen Datenbank speichert (MySQL, etc), dann kann die Datenbank leicht für den aktuellen Zustand der Simulationen abgefragt werden. Dies sollte gut skalieren bis zu dem Punkt, wo die Zeit, um die Simulationsdaten zu allen Kunden zur Verfügung zu stellen genommen ist gleich die Zeit benötigt, um die Simulation durchzuführen.

einfachste Weg Computing auf einem Linux-Cluster zu verteilen ist MPI zu verwenden. Ich würde vorschlagen, dass Sie bei MPICH2 herunterladen und schauen. Es ist kostenlos. ihre Homepage ist hier

Wenn Sie Ihre Simulationen völlig unabhängig sind, brauchen Sie nicht die meisten Funktionen von MPI. Sie könnten ein paar Zeilen C schreiben müssen mit MPI-Schnittstelle und die Ausführung des Skripts oder Java-Programms beginnen.

Sie sollten überprüfen Hazelcast, einfachste peer2peer (keine zentrale Server) Clustering-Lösung für Java. Versuchen Sie Hazelcast Distributed ExecutorService für Ihren Code auf dem Cluster ausgeführt wird.

Grüße,

-talip

Sie bereits vorgeschlagen, aber disqualifiziert es: Multi-Cores. Sie könnten für Multi-Core-gehen, wenn man genug Kern hat. Ein heißes Thema atm ist GPGPU-Computing. Esp. NVIDIAs CUDA ist eine sehr priomising Ansatz, wenn Sie viele unabhängige Aufgabe haben, die die gleiche Berechnung zu tun haben. Eine GTX 280 liefert Ihnen 280 Kerne, die bis 1120 berechnen kann - simultan 15360 Threads. Ein Paar von ihnen könnte Ihr Problem lösen. Wenn es wirklich implementierbar ist abhängig von Ihrem Algorithmus (Datenfluss vs. Kontrollfluss), da alle skalare Prozessoren in einer SIMD-Mode betrieben werden.

Nachteil: es wäre C / C ++, Java nicht

Wie optimiert sind Ihre Algorithmen? Sind Sie mit nativen BLAS-Bibliotheken? Sie können durch den Wechsel von naiven Bibliotheken optimiert diejenigen über eine Größenordnung Leistungsgewinn erhalten. Einige, wie ATLAS werden auch verteilt automatisch die Berechnungen über mehrere CPUs auf einem System, so dass Kugel umfasst 1 automatisch.

AFAIK Cluster in der Regel nicht als eine Einheit behandelt. Sie werden in der Regel als separater Knoten und programmierten mit Sachen wie MPI und Scalapack behandelt, um die Elemente von Matrizen auf mehrere Knoten zu verteilen. Dies ist nicht wirklich helfen Sie allzu viel, wenn Ihr Datensatz auf einem Knoten im Speicher passt sowieso.

Haben Sie sich unter Terracotta ?

Für die Arbeitsverteilung wollen Sie die Master / Worker-Framework verwenden .

Vor zehn Jahren hat die Firma für die ich gearbeitet sah eine ähnliche Virtualisierungslösung und Sun, Digital und HP alle unterstützten es an der Zeit, aber nur mit state-of-the-art-Supercomputer mit Hardware hotswap und dergleichen. Seitdem ich hörte Linux die Art der Virtualisierung unterstützt Sie nach für Lösung # 3 suchen, aber ich habe es nie selbst.

Java Primitiven und Leistung

Wenn Sie jedoch Matrixberechnungen wollen Sie würden sie in nativen Code zu tun, nicht in Java (vorausgesetzt, Sie verwenden Java Primitive). Besonders Cache-Misses sehr teuer, und die Verschachtelung in Ihren Arrays wird die Leistung töten. Nicht verschachtelte Speicherblöcke in Ihrer Matrizen und nativen Code finden Sie die meisten der Beschleunigung ohne zusätzliche Hardware bekommen.

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