Ich habe ein Java-Programm, das viele kleine Simulationen durchführt. Es führt einen genetischen Algorithmus aus, bei dem jede Fitnessfunktion eine Simulation mit Parametern für jedes Chromosom ist. Jede Simulation dauert vielleicht 10 oder so Sekunden, wenn sie alleine läuft, und ich möchte eine ziemlich große Populationsgröße (sagen wir 100?) ausführen. Ich kann die nächste Simulationsrunde erst starten, wenn die vorherige beendet ist. Ich habe Zugang zu einem Rechner mit einer ganzen Reihe von Prozessoren und frage mich, ob ich etwas tun muss, damit die Simulationen parallel laufen. Ich habe noch nie etwas explizit für Multicore-Prozessoren geschrieben, und ich weiß, dass das eine gewaltige Aufgabe ist.
Ich würde also gerne Folgendes wissen: In welchem Umfang und wie gut parallelisiert die JVM? Ich habe gelesen, dass sie Low-Level-Threads erstellt, aber wie intelligent ist sie? Wie effizient ist sie? Würde mein Programm schneller laufen, wenn ich jede Simulation zu einem Thread machen würde? Ich weiß, dass dies ein umfangreiches Thema ist, aber könnten Sie mich auf einführende Literatur über Parallelverarbeitung und Java hinweisen?
Herzlichen Dank!
Aktualisierung: Ok, ich habe einen ExecutorService implementiert und meine kleinen Simulationen implementieren Runnable und haben run() Methoden. Anstatt dies zu schreiben:
Simulator sim = new Simulator(args);
sim.play();
return sim.getResults();
Ich schreibe dies in meinen Konstruktor:
ExecutorService executor = Executors.newFixedThreadPool(32);
Und jedes Mal, wenn ich dem Pool eine neue Simulation hinzufügen möchte, führe ich dies aus:
RunnableSimulator rsim = new RunnableSimulator(args);
exectuor.exectue(rsim);
return rsim.getResults();
Le site RunnableSimulator::run()
Methode ruft die Simulator::play()
Methode, beide haben keine Argumente.
Ich glaube, ich habe eine Fadenstörung, weil die Simulationen jetzt fehlschlagen. Mit "Fehler" meine ich, dass Variablen Werte halten, die sie eigentlich nicht halten sollten. Es wurde kein Code innerhalb der Simulation geändert, und vorher lief die Simulation perfekt über viele, viele verschiedene Argumente. Die Simulation funktioniert folgendermaßen: In jeder Runde erhält sie ein Spielteil und durchläuft alle Orte auf dem Spielbrett. Es wird geprüft, ob der angegebene Ort gültig ist, und wenn ja, wird die Spielfigur übertragen und die Güte des Brettes gemessen. Offensichtlich werden nun ungültige Orte an die Commit-Methode übergeben, was dazu führt, dass der Index überall außerhalb der Grenzen liegt.
Jede Simulation ist ein eigenes Objekt, richtig? Basierend auf dem obigen Code? Ich kann genau denselben Satz von Argumenten an die RunnableSimulator
y Simulator
Klassen und der lauffähigen Version werden Ausnahmen ausgelöst. Was denken Sie, könnte die Ursache dafür sein und was kann ich tun, um dies zu verhindern? Kann ich einige Code-Beispiele in einer neuen Frage zur Verfügung stellen, um zu helfen?