BlueM.Opt Multithreading: Difference between revisions
(removed application S::CAN #37, v1.9.0) |
|||
(6 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{BlueM.Opt_nav}} | {{BlueM.Opt_nav}} | ||
<div style="float:right; margin-left:10px">__TOC__</div> | <div style="float:right; margin-left:10px">__TOC__</div> | ||
==Multithreading support== | |||
In multithreading mode, multiple individuals are evaluated simultaneously, providing for considerable speed improvements. | |||
:''& | Multithreading is switched on the '''General''' tab of the [[BlueM.Opt Settings|settings pane]]. | ||
Whether multithreading is available depends on the selected combination of application and algorithm, both of which have to support multithreading. | |||
The following table shows which combinations currently allow for multithreading: | |||
{| class="standard stripes" cellspacing="0" cellpadding="5" | |||
! !! colspan="5" style="text-align:center" | Algorithm | |||
|- | |||
! Application !! [[PES]] !! [[SensiPlot]] !! [[Hooke & Jeeves]] !! [[MetaEvo]] !! [[DDS]] | |||
|- | |||
| '''[[BlueM.Sim]]''' || √ || x || x || √ || x | |||
|- | |||
| '''[[TALSIM]]''' || √ || x || x || √ || x | |||
|- | |||
| '''[[SMUSI]]''' || x || x || x || x || x | |||
|- | |||
| '''[[SWMM]]''' || √ || x || x || √ || x | |||
|- | |||
| '''[[Testprobleme]]''' || x || x || x || x || x | |||
|- | |||
| '''[[Traveling Salesman]]''' || x || x || x || x || x | |||
|} | |||
'''Legend''': <code>√</code>: multithreading supported | <code>x</code>: multithreading not supported | <code>N/A</code>: combination not supported | |||
==Anleitung zur Implementation für weitere Methoden== | ==Anleitung zur Implementation für weitere Methoden== | ||
:''→ siehe auch Bug 345'' | |||
===Zusammenfassung=== | ===Zusammenfassung=== | ||
# Array von Individuen an <code>Sim.Evaluate()</code> übergeben | # Array von Individuen an <code>Sim.Evaluate()</code> übergeben | ||
Line 18: | Line 42: | ||
Sobald ein Individuum (erfolgreich) fertig evaluiert wurde, wird folgendes Event ausgelöst: | Sobald ein Individuum (erfolgreich) fertig evaluiert wurde, wird folgendes Event ausgelöst: | ||
<vbnet>Public Event IndividuumEvaluated(ByRef ind As EVO.Common.Individuum, ByVal i_Nachf As Integer)</ | <source lang="vbnet">Public Event IndividuumEvaluated(ByRef ind As EVO.Common.Individuum, ByVal i_Nachf As Integer)</source> | ||
Nachdem alle Individuen fertig evaluiert wurden, wird das gesamte Array von Individuen zurückgegeben. | Nachdem alle Individuen fertig evaluiert wurden, wird das gesamte Array von Individuen zurückgegeben. | ||
Line 28: | Line 52: | ||
====Echtzeitauswertung==== | ====Echtzeitauswertung==== | ||
Das Event muss von einer Methode abgefangen werden, im ES-Controller ist dies beispielsweise folgende Methode: | Das Event muss von einer Methode abgefangen werden, im ES-Controller ist dies beispielsweise folgende Methode: | ||
<vbnet>Private Sub processIndividuum(ByRef ind As Common.Individuum, ByVal iNachfahre As Integer) Handles Sim1.IndividuumEvaluated</ | <source lang="vbnet">Private Sub processIndividuum(ByRef ind As Common.Individuum, ByVal iNachfahre As Integer) Handles Sim1.IndividuumEvaluated</source> | ||
Nachdem die Methode <code>Sim.Evaluate()</code> fertig ist, müssen dann nur noch evtl. vorhandene ''nicht''-erfolgreich evaluierte Individuen behandelt werden. (Erkennbar an dem zurückgegebenen Array von Booleans.) | Nachdem die Methode <code>Sim.Evaluate()</code> fertig ist, müssen dann nur noch evtl. vorhandene ''nicht''-erfolgreich evaluierte Individuen behandelt werden. (Erkennbar an dem zurückgegebenen Array von Booleans.) | ||
Line 43: | Line 67: | ||
===ThreadFree=== | ===ThreadFree=== | ||
ThreadFree fragt die Threadverwaltung ob ein Thread verfügbar ist und gestartet werden kann. Falls JA wird das | ThreadFree fragt die Threadverwaltung, ob ein Thread verfügbar ist und gestartet werden kann. Falls JA wird das entsprechende Thread Verzeichnis vorbereitet und das zu evaluierende Individuum an den Thread übergeben (Preprocessing). Mit launchSim wird der Thread (die Simulation) gestartet. | ||
===ThreadReady=== | ===ThreadReady=== | ||
ThreadReady fragt die Threadverwaltung ob ein Thread ob ein Thread beendet ist. Falls JA werden die Ergebnisse aus dem | ThreadReady fragt die Threadverwaltung, ob ein Thread ob ein Thread beendet ist. Falls JA werden die Ergebnisse aus dem entsprechenden Verzeichnis verarbeitet (Postprocessing). Des Weiteren wird hier in zwei Fälle unterschieden. Je nachdem ob die Simulation erfolgreich war (SimOK) wird die Simulation entweder verarbeitet oder verworfen und neu gestartet. | ||
===launchSim (überladen)=== | ===launchSim (überladen)=== | ||
launchSim führt die Simulation aus und kann entweder | launchSim führt die Simulation aus und kann entweder sequenziell (ohne Parameter) oder parallel (mit Parameter) für die Threads verwendet werden. | ||
[[ | [[Category:BlueM.Opt Usage|M]] | ||
[[Category:BlueM.Opt Development|M]] |
Latest revision as of 05:04, 18 December 2021
BlueM.Opt | Download | Usage | Development
Multithreading support
In multithreading mode, multiple individuals are evaluated simultaneously, providing for considerable speed improvements.
Multithreading is switched on the General tab of the settings pane.
Whether multithreading is available depends on the selected combination of application and algorithm, both of which have to support multithreading.
The following table shows which combinations currently allow for multithreading:
Algorithm | |||||
---|---|---|---|---|---|
Application | PES | SensiPlot | Hooke & Jeeves | MetaEvo | DDS |
BlueM.Sim | √ | x | x | √ | x |
TALSIM | √ | x | x | √ | x |
SMUSI | x | x | x | x | x |
SWMM | √ | x | x | √ | x |
Testprobleme | x | x | x | x | x |
Traveling Salesman | x | x | x | x | x |
Legend: √
: multithreading supported | x
: multithreading not supported | N/A
: combination not supported
Anleitung zur Implementation für weitere Methoden
- → siehe auch Bug 345
Zusammenfassung
- Array von Individuen an
Sim.Evaluate()
übergeben - Optional: Methode schreiben, die das Event
Sim.IndividuumEvaluated()
abfängt und evaluierte Individuen sofort verarbeitet
Alternativ: warten, bisSim.Evaluate()
mit allen Individuen fertig ist und die Individuen dann stoßweise verarbeiten.
Ausführliche Anleitung
Multithreading wird von der Klasse Sim
übernommen.
Die folgende (überladene) Methode kriegt ein Array von Individuen übergeben, die dann in multiplen Threads abgearbeitet werden. <vbnet>Public Overloads Function Evaluate(ByRef inds() As EVO.Common.Individuum, Optional ByVal storeInDB As Boolean = True) As Boolean()</vbnet>
Sobald ein Individuum (erfolgreich) fertig evaluiert wurde, wird folgendes Event ausgelöst:
Public Event IndividuumEvaluated(ByRef ind As EVO.Common.Individuum, ByVal i_Nachf As Integer)
Nachdem alle Individuen fertig evaluiert wurden, wird das gesamte Array von Individuen zurückgegeben.
Es gibt also zwei Möglichkeiten, die evaluierten Individuen weiterzuverarbeiten:
- In Echtzeit (mit Event)
- Stoßweise (ohne Event)
Echtzeitauswertung
Das Event muss von einer Methode abgefangen werden, im ES-Controller ist dies beispielsweise folgende Methode:
Private Sub processIndividuum(ByRef ind As Common.Individuum, ByVal iNachfahre As Integer) Handles Sim1.IndividuumEvaluated
Nachdem die Methode Sim.Evaluate()
fertig ist, müssen dann nur noch evtl. vorhandene nicht-erfolgreich evaluierte Individuen behandelt werden. (Erkennbar an dem zurückgegebenen Array von Booleans.)
Stoßweise Auswertung
Warten, bis die Methode Sim.Evaluate()
fertig ist, und die Individuen erst dann verarbeiten.
Evaluierung ohne Multithreading
Für mit ohne Multithreading gibts die Methode Sim.Evaluate()
auch für einzelne
Individuen.
Anleitung zur Implementation in weiteren Anwendungen
ThreadFree
ThreadFree fragt die Threadverwaltung, ob ein Thread verfügbar ist und gestartet werden kann. Falls JA wird das entsprechende Thread Verzeichnis vorbereitet und das zu evaluierende Individuum an den Thread übergeben (Preprocessing). Mit launchSim wird der Thread (die Simulation) gestartet.
ThreadReady
ThreadReady fragt die Threadverwaltung, ob ein Thread ob ein Thread beendet ist. Falls JA werden die Ergebnisse aus dem entsprechenden Verzeichnis verarbeitet (Postprocessing). Des Weiteren wird hier in zwei Fälle unterschieden. Je nachdem ob die Simulation erfolgreich war (SimOK) wird die Simulation entweder verarbeitet oder verworfen und neu gestartet.
launchSim (überladen)
launchSim führt die Simulation aus und kann entweder sequenziell (ohne Parameter) oder parallel (mit Parameter) für die Threads verwendet werden.