|
|
Parallel Toolbox - Mehrere Funktionen parallel |
|
Killemann |
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 23.02.12
|
|
|
|
Wohnort: Dresden
|
|
|
|
Version: R2015b
|
|
|
|
|
|
Verfasst am: 28.02.2012, 11:47
Titel: Parallel Toolbox - Mehrere Funktionen parallel
|
|
|
|
|
Hallo Matlab-Forum!
Wie ihr seht, bin ich erst seit einigen Tagen angemeldet und habe noch keine Beiträge geschrieben. Ich habe mich jetzt hier angemeldet, weil ich nach mehrere Tagen Recherche im Internet keine wirkliche Lösung gefunden habe.
Zu meinem Problem: Ich schreibe ein Programm zur Lösung partieller Differentialgleichungen. In jedem Zeitschritt des Algorithmus muss die Ortsdiskretisierung aktualisiert werden. Dies geschieht in zwei bzw. drei Funktionen (2D- oder 3D-Fall des Werkstücks).
Momentan arbeite ich die Funktionen nacheinander ab, würde sie aber gern parallel berechnen lassen, da sie teilweise unabhängig voneinander sind. Als Pseudocode im 2D-Fall:
Jede Variable ist dabei ein zwei- bzw. dreidimensionales Feld. Wie man sieht, nutzen beide Funktionen eine Variable gemeinsam (hier s5). Im 3D-Fall kommen dann weitere Variablen dazu. Dennoch sind die Berechnungen jeweils unabhängig voneinander, können also parallel stattfinden.
Meine ersten Ansätze waren jetzt createJob/createTask, aber wenn ich das richtig verstanden habe, kann ich damit die selbe Funktion mehrmals parallel mit verschiedenen Startwerten berechnern, oder? Das nützt mir allerdings nichts.
Die zweite Idee ist eine parfor-Schleife, wie man es in diesem Beitrag findet:
http://www.gomatlab.de/ausfuehrung-.....-computing-tb-t16029.html
Daran bastel ich aber noch. Speziell die Ein- und Ausgabe meiner Felder.
Nun aber noch einmal meine eigentliche Frage:
Ist es mit der Parallel Computing Toolbox möglich, zwei/drei verschiedene Funktionen parallel auszuführen? Wenn ja, mit welchem Befehl?
Vielen Dank!
Killemann
PS: Falls es Nachfragen gibt, RAM ist genügend da, der Prozessor ist ein i7. Aus Speichereffizienz muss ich (erstmal) nicht achten.
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.02.2012, 19:26
Titel:
|
|
Hallo,
Zitat: |
Meine ersten Ansätze waren jetzt createJob/createTask, aber wenn ich das richtig verstanden habe, kann ich damit die selbe Funktion mehrmals parallel mit verschiedenen Startwerten berechnern, oder? Das nützt mir allerdings nichts. |
Das hast du falsch verstanden. Du verwendest für die Erstellung jeder Task einen createTask-Befehl. Dabei kannst du natürlich verschiedene Function Handles angeben. Ich sehe jedoch die Gefahr, dass der Overhead dabei größer ist als der erzielte Gewinn.
Ich würde zunächst sicherstellen, dass ein Großteil der Rechenzeit wirklich in diesem Code-Teil verbracht wird. Selbst dann denke ich, dass du wahrscheinlich mit Matlab Pool, einer parfor-Schleife und switch-case in der Iteration besser bedient sein wirst.
Grüße,
Harald
|
|
|
Killemann |
Themenstarter
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 23.02.12
|
|
|
|
Wohnort: Dresden
|
|
|
|
Version: R2015b
|
|
|
|
|
|
Verfasst am: 07.03.2012, 08:43
Titel:
|
|
Tut mir leid, dass ich mich so lange nicht zurück gemeldet habe.
Ich bin erst heute wieder auf Arbeit und konnte die Toolbox testen.
Leider ist der erwünscht Erfolg nicht eingetreten, die parallele Variante des Programms benötigt doppelt so viel Zeit wie die sequentielle. Der Overhead der parfor-Anweisung scheint den Nutzen zufressen.
Thema kann geschlossen werden!
Viele Grüße
Killemann
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.03.2012, 09:48
Titel:
|
|
Hallo,
im Einzelfall sind solche Phänomene durchaus möglich.
Man müsste den Code haben und damit experimentieren können, um das zum einen nachvollziehen zu können und zum anderen Verbesserungsvorschläge machen zu können.
Bitte in jedem Fall beachten: matlabpool/parfor und createJob/createTask sind unterschiedliche Konzepte für paralleles Rechnen und sollten nicht vermischt werden!
Grüße,
Harald
|
|
|
Killemann |
Themenstarter
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 23.02.12
|
|
|
|
Wohnort: Dresden
|
|
|
|
Version: R2015b
|
|
|
|
|
|
Verfasst am: 07.03.2012, 11:28
Titel:
|
|
|
|
|
Hallo Harald!
Ich arbeite zurzeit nur mit matlabpool open und parfor und habe keine Tasks/Jobs in meinem Code.
Als Beispiel kann ich dir folgenden Code posten:
Ich bastel mir ein Functionhandle mit den beiden Funktionen, die v1 und v3 aktualisieren sollen.
Ebenso lege ich ein Input-Array an , in dem jeweils die Inputs für die erste und die zweite Funktion drin stecken. Und zum Schluss noch ein Array für die Outputs.
Wie gesagt, an sich sind die Berechnungen von v1 und v3 unabhängig voneinander, brauchen aber teilweise die selben Eingabedaten.
Der ganze Spaß muss dann 1188-mal gemacht werden (Anzahl der Zeitschritte), wodurch 2376-mal die parfor-Schleife gerufen wird.
Parallel benötigt das Programm 73s, sequentiell (also beide Funktionen nacheinander) nur 17s.
Achso: Im Sinne der Datenverwaltung ist es wenig sinnvoll, die outputs wieder auf v1 und v3 zurück zu kopieren, aber das war der einfachste Weg, um den Rest meines Programms (u.a. Setzen von Randbedingungen in jedem Schritt) nicht umschreiben zu müssen. Außerdem wird das Kopieren vom Profiler mit unter 1s gestoppt bei einer Gesamtzeit von etwa 73s.
Viele Grüße
Killemann
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.03.2012, 12:56
Titel:
|
|
Hallo,
mit anderen Worten, eine Iteration der parfor-Schleife benötigt 0,01s. Da ist es klar, dass der Aufwand für das Hin- und Herschicken der Daten zwischen den einzelnen Prozessen größer ist als der Nutzen.
Interessanter wäre es, wenn du 2000 Iterationen am Stück hättest, und dann 1000 auf einen, 1000 auf den anderen Prozess verteilen könntest.
Grüße,
Harald
|
|
|
Killemann |
Themenstarter
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 23.02.12
|
|
|
|
Wohnort: Dresden
|
|
|
|
Version: R2015b
|
|
|
|
|
|
Verfasst am: 07.03.2012, 14:06
Titel:
|
|
Ja, das habe ich der Matlab-Dokumentation auch so entnommen. (Also dem Beispiel unter "doc parfor")
Leider geht das bei mir nicht. In jedem Zeitschritt werden die Feldgrößen über dem Ortsgitter aktualisiert. Die Iteration geht von Zeitschritt zu Zeitschritt und ruft dort "nur zwei" Funktionen.
Die Zeitschritte 1001-2000 sind damit abhängig von dem, was in den Schritten 1-1000 passiert, weshalb ich das nicht auf zwei Prozesse aufteilen kann.
Schade, aber vielen Dank für die Hilfe!
Killemann
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|