WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Parallel Toolbox - Mehrere Funktionen parallel

 

Killemann
Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 23.02.12
Wohnort: Dresden
Version: R2015b
     Beitrag Verfasst am: 28.02.2012, 11:47     Titel: Parallel Toolbox - Mehrere Funktionen parallel
  Antworten mit Zitat      
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:

Code:

v1_neu = f1(v1_alt, s1, s5);
v3_neu = f3(v3_alt, s3, s5);
 


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.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.02.2012, 19:26     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Killemann
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 23.02.12
Wohnort: Dresden
Version: R2015b
     Beitrag Verfasst am: 07.03.2012, 08:43     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.03.2012, 09:48     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Killemann
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 23.02.12
Wohnort: Dresden
Version: R2015b
     Beitrag Verfasst am: 07.03.2012, 11:28     Titel:
  Antworten mit Zitat      
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:

Code:

        fh      = {@delta_v1_parallel_2D @delta_v3_parallel_2D};
        in      = {{z v1 s1 s5 q3_min q3_max rc dx1 dx3 dt N1 N3 f density_temp}...
            {z v3 s3 s5 q3_min q3_max rc dx1 dx3 dt N1 N3 density_temp}};
        out     = {zeros(size(v1)) zeros(size(v3))};

        parfor par_ind = 1:2
            out{par_ind} = fh{par_ind}(in{par_ind}{:});
        end

        v1 = out{1};
        v3 = out{2};
 


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.03.2012, 12:56     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Killemann
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 8
Anmeldedatum: 23.02.12
Wohnort: Dresden
Version: R2015b
     Beitrag Verfasst am: 07.03.2012, 14:06     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.