ich habe eine GUI mit Graphen, die per Button eine m-File startet.
diese m-File steuert verschiedene Geräte ( z.B. NWA ) an.
Nach der Initialisierung wird in einer While Schleife Messungen durchgeführt und geplottet.
Im Moment messen und berechnen wir mit einer Geschwindigkeit von etwa 0,9 Sekunden pro Schleifendurchlauf.
Das soll nach Möglichkeit perfektioniert werden.
Tests haben ergeben, dass das NWA mit 0,45-0,5 Sekunden mit Abstand am längsten für seinen "Job" braucht. Die anderen Geräte liegen bei 0,1 und 0,05 Sekunden "Topspeed".
Nun war unsere Idee, das ganze zu Parallelisieren. Und zwar am besten das NWA (da es ja bekanntlich am längsten braucht) mit einem Kern ansteuern und alles andere mit dem anderen Kern.
Da ich nie mit Parallelisierung gearbeitet habe, weiß ich nun nicht ob und wie das in Matlab funktionieren würde.
Natürlich werde ich mich jetzt auch nebenbei einlesen und etwas an kleineren Programmen herumprobieren.
dürfte wenn am besten mit der Parallel Computing Toolbox und SPMD klappen. Videos dazu gibts hier:
http://www.mathworks.de/products/pa.....-computing/tutorials.html
Darauf achten: auch Kommunikation kostet Zeit. Im Extremfall kann es passieren, dass der parallelisierte Code langsamer ist als das Original.
bringen mir wenn ich das richtig verstanden habe leider nichts,
da ich keine festen Variablen in meiner Schleife habe die parallel abgearbeitet werden können.
Mit jedem Schleifendurchlauf werden Messgeräte angesprochen, deren Rückgabewerte dann im nächsten Schleifendurchlauf gebraucht werden.
Dieses batch habe ich noch nicht ganz verstanden.
Kann ich theoretisch den Befehl für das NWA, welches ja zu lange braucht, per batchjob ausführen und der wird dann parallel bearbeitet und die restliche Schleife arbeitet weiter?
Und wenn die Rückgabe des NWA gebraucht wird kann ich ja ein
Und was genau hat es mit diesem parpool auf sich?
Kann ich bspw. mit parpool(2) zwei Instanzen erstellen und für jeden Befehl angeben in welcher Instanz er ausgeführt werden soll?
da ich keine festen Variablen in meiner Schleife habe die parallel abgearbeitet werden können.
Mit jedem Schleifendurchlauf werden Messgeräte angesprochen, deren Rückgabewerte dann im nächsten Schleifendurchlauf gebraucht werden.
Das verstehe ich nicht. Am besten ein konkretes Code-Beispiel.
spmd ermöglicht dir, gezielt in einer Session bestimmten Code auszuführen. Das sollte also alles sein, was du brauchst.
Zitat:
Kann ich theoretisch den Befehl für das NWA, welches ja zu lange braucht, per batchjob ausführen und der wird dann parallel bearbeitet und die restliche Schleife arbeitet weiter?
Theoretisch ja, praktisch nein: um das zu machen, muss für jeden batch-Aufruf erst im Hintergrund eine MATLAB-Session gestartet werden, und das dauert ca. 10 Sekunden.
Zitat:
Kann ich bspw. mit parpool(2) zwei Instanzen erstellen und für jeden Befehl angeben in welcher Instanz er ausgeführt werden soll?
Mit parfor werden automatisch die Iterationen einer for-Schleife ausgespaltet, mit spmd kann man in Kombination mit labindex angeben, was in welcher Instanz ausgeführt werden soll.
Es ist nicht notwendig, explizit einen parallel pool zu starten, wenn man mit spmd oder parfor arbeitet, da das (zumindest mit Standardeinstellungen) automatisch geschieht. Der einzige Vorteil von parpool ist, dass der parallel pool so schon vorab gestartet werden kann.
Hmm dan habe ich spmd wohl nicht wirklich verstanden.
Ja dass batch 10 sekunden braucht habe ich gemerkt war wohl der falsche Ansatz.
Hab mal einen beispielhaften Code geschrieben der so etwa den Ablauf darstellt. Die Pausen sind eingebaut um die "Reaktionszeit" der jeweiligen Geräte zu simulieren.
Den Bereich der möglichst Parallel laufen soll habe ich mit Kommentarzeilen "eingeklammert"
Hoffe du kannst damit was anfangen.
Grüße
der Anfänger
Code:
i = 1;
t = zeros(1,20000);
inc = zeros(1,20000);
ref = zeros(1,20000);
temp = zeros(1,20000);
value = zeros(1,20000);
value(1) = 1.5;
Flag = evalin('base','Flag');
startTime = clock;
und zu was der mit % umrahmte Code nun parallel laufen?
Die usinglabindex.m zum Video "spmd: parallel code beyond parfor" kann als Template für die Verwendung von spmd mit labindex dienen.
Wenn die Daten des einen Prozesses dem anderen zur Verfügung stehen sollen, müssen sie mit labSend/labReceive geschickt werden. Ob das dann hinsichtlich Performance viel bringt, wird auf den Versuch ankommen.
Hier im Beispielcode scheint das ganz gut zu funktionieren.
Ich versuche das jetzt in den richtigen Code einzubauen. Hoffentlich läuft das auch ohne weitere Probleme.
Kannst du hier mal drüber schauen ob ich evtl. etwas anders/besser machen kann/sollte?
Falls noch Probleme auftauchen melde ich mich hier wieder.
Wenn ich das jedesmal neu plotten will, kommt keine Errormeldung doch ein plot kommt auch nicht. Wenn ich es per set machen will, existiert das handle im Worker nicht.
Code:
Error detected on worker 2.
Invalid or deleted object.
das ist auch eine unrealistische Erwartung.
Dir muss klar sein, dass in dem parallel pool komplett unabhängige Prozesse laufen. Diese Prozesse sind so angelegt, dass sie sogar auf verschiedenen Rechnern laufen könnten. Das Plotten muss also entweder im Client stattfinden, oder du musst die generierten Figures abspeichern und dir die Dateien holen.
Zitat:
Desweiteren wäre interessant wie ich Variablen und Handles in die Workspace der Worker importieren kann.
Variablen: siehe mein letzter Beitrag.
Handles: ich würde sagen gar nicht, da die Grafikobjekte ja im anderen Prozess nicht existieren.
Na dass die Prozesse unabhängig von einander laufen, ist mir ja schon klar.
Die Variablen unter den Workern gebe ich ja mit labSend/labReceive über.
Zeitlich macht die Übergabe nicht viel aus.
Ich wollte aber wissen, wie ich z.b. die variablen aus einer GUI handle übernehmen kann.
Ich dachte wenn ich aus einem Worker aus plotte hat das ja nichts mit dem anderen Worker zu tun.
Ich kann nicht mal plot(1,1) anwenden. Beziehungsweise wird es geplottet aber nicht visible? Ich weiß es nicht.
Wie kann ich das denn umgehen?.
Muss ich die Variablen unbedingt in eine Datei speichern und von dort wieder laden?
Es ist so, dass ich eine GUI mit axes und Buttons habe.
per Pushbutton wird die m-File zum plotten aufgerufen und die handles zu den Plots übergeben. Aus der m-File konnte ich dann Problemlos die Properties der handles bearbeiten. (bevor ich parallelisiert habe)
Also geht das jetzt nicht, da die Axes bzw. die gesamte Figure in den parallelen Prozessen garnicht existiert?
was meinst du mit "die variablen aus einer GUI handle "?
Zitat:
Ich dachte wenn ich aus einem Worker aus plotte hat das ja nichts mit dem anderen Worker zu tun.
Ich kann nicht mal plot(1,1) anwenden. Beziehungsweise wird es geplottet aber nicht visible? Ich weiß es nicht.
Du siehst eben nur die Plots von deinem Prozess, aber nicht die der anderen Prozesse des parallel pools.
Zitat:
Also geht das jetzt nicht, da die Axes bzw. die gesamte Figure in den parallelen Prozessen garnicht existiert?
mit Variablen aus der GUI meinte ich:
in meinem Code habe ich variable Parameter die mit jedem Schleifendurchlauf aktualisiert werden.
Diese Variablen kann ich in der GUI setzen und während der Messung ändern.
In meinem Beispielcode hier wären das die Variablen 'a' 'b' und 'c'. Hier natürlich einfach random gesetzt.
Hmm verstehe. Die Frage wäre nun, ob man nun sagen könnte bspw.: ich will jetzt den Prozess mit labindex2 visible setzen.
Aber wie ich aus anderen Forenbeiträgen jetzt weiß ist pct ja nicht fähig zu plotten
Ich habe jetzt übrigens einen anderen Lösungsweg gefunden:
Undzwar parfeval
Code:
function parfevalTest()
i = 1;
t = zeros(1,20000);
inc = zeros(1,20000);
ref = zeros(1,20000);
temp = zeros(1,20000);
value = 1.5;
Natürlich habe ich parpool im voraus schon ausgeführt.
Die Methode klappt in meinem Beispiel zwar wunderbar, doch im Originalcode kommen die Messergebnisse ja nicht irgendwoher, sondern ich muss eine Verbindung zum Gerät erstellen mit NWA = nwaKlasse(ip).
Und wie wir ja schon wissen kann ich keine Objekthandles übergeben, da diese im Parallelpool nicht existiert.
Aus zeitlichen Gründen kann ich das Objekt nicht jedesmal im neuen Prozess neu erzeugen.
Fällt denn keinem eine Möglichkeit ein, wie man das machen kann..
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
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.