Verfasst am: 18.06.2011, 12:39
Titel: Programm mit parfor beschleunigen?
Hallo!
Ich habe mir ein Matlab-Programm geschrieben, dass für verschiedene Parameter eine selbst geschriebene Identifikation ausführt, welche eine Übertragungsfunktion zurückliefert.
Mit dieser wird dann eine Simulation mit einem Simulink-File durchgeführt. Die Daten aus der Simulation werden mit den Messdaten verglichen und werden entsprechend bewertet. Die 2 Bewertungen werden dann in ein (Mehrdim.)-Array abgespeichert.
Das Array beinhaltet, konkret die drei verschiedenen Parameter und eben 2 Felder für die Bewertung.
Das ganze hängt dann im Moment noch in einer for-schleife. Da ich jetzt doch schon ca. 30.000 bzw. vielleicht 100.000 verschiedene Parametersätze habe, könnte da vielleicht parfor was bringen?
for k=1:length(ende)
param(1+(k-1)*lenEndwert:lenEndwert+(k-1)*lenEndwert,1) = ende(k);
for l=1:lenDs
index2 = 1+(k-1)*lenEndwert+(l-1)*lenQ;
param(index2:index2+lenQ-1,2) = q;
param(index2:index2+lenQ-1,3) = downsample(l);
end end
Jetzt bringt er mir 2 Meldungen und zwar in der Zeile wo ich meine Funktion: idnetFcn aufrufe bezüglich des param-Array:
"In a PARFOR loop, variable 'param' is indexed in different ways, potentially causing dependencies between iterations. "
Und in der Zeilen wo ich errEnd = zuweise die Meldung:
"variable 'ysim' is indexed but not sliced in a parfor loop. This might result in unnecessary communications overhead." Für ysim und y_ident.
ysim ändert sich nie, sind die messdaten und y_ident sind die daten die ich aus der Simulink-Simulation bekomme.
Falls es möglich ist bzw. was bringt auf parfor umzustellen, wäre ich um Hilfe sehr dankbar (sind leider meine ersten Gehversuche mit parfor).
um sagen zu können, ob parfor was bringt, ist zunächst mal die Frage: was für eine Hardware verwendest du, besonderes wieviele Rechenkerne?
Hast du gar Zugang zu einem Rechencluster?
Idealerweise lastet parfor in einem MATLAB Pool die Rechenkerne optimal aus und reduziert so die Rechenzeit spürbar. Jedoch wirst du auf Dualcore kaum mehr als Faktor 2 und auf Quadcore kaum mehr als Faktor 4 erreichen. Es ist also auch die Frage, was du mit diesen Daten anfangen willst. Wenn es um das Finden der bestmöglichen Parameterkombination geht, sollte man das evtl. als Optimierungsproblem behandeln.
Danke für die Antwort, ja ich hätte einen Quadcore zur Verfügung, und wenn ich den Faktor vier schaffen könnte, dann wäre ich schon sehr zufrieden damit.
Wenn mir jemand bezüglich der Fehler helfen kann, dann wäre das toll, dann probiere ich es einfach aus.
@Optimierungsproblem, bin gern für Vorschläge offen
leider kennt er dann in der Funktion parsim
die Übertragungsfunktion Gz_ident etc. nicht
Weiß jemand wie ich das übergeben kann? Es geht einzeln schon, aber in der parfor-loop dann eben nicht
l@Harald
Also im Prinzip möchte ich folgendes machen:
Ich habe Messdaten von einem Labormodell und ein selbstgeschriebenes Least quares Verfahren zum identifizieren, dem ich eben verschiedene Parameter mit geben kann, konkret die Messdaten, eine Vergessensfaktor und noch ein Downsampling (um den Einfluss des Rauschens zu minimieren), welches mir eine Übertragungsfunktion meines Modells liefert
Jetzt probiere ich verschiedene Parameter durch und überprüfe die "Güte" der identifizierten Übertragungsfunktion in dem ich damit eine Simulink-Simulation mit den selben Inputs wie am Labormodell mache und dann die Messdaten mit den Simulierten Daten vergleiche
Warum kopierst du die 2 Zeilen nicht einfach in den Hauptcode?
Zitat:
Ich habe Messdaten von einem Labormodell und ein selbstgeschriebenes Least quares Verfahren zum identifizieren, dem ich eben verschiedene Parameter mit geben kann, konkret die Messdaten, eine Vergessensfaktor und noch ein Downsampling (um den Einfluss des Rauschens zu minimieren), welches mir eine Übertragungsfunktion meines Modells liefert
Jetzt probiere ich verschiedene Parameter durch und überprüfe die "Güte" der identifizierten Übertragungsfunktion in dem ich damit eine Simulink-Simulation mit den selben Inputs wie am Labormodell mache und dann die Messdaten mit den Simulierten Daten vergleiche
Warum überlässt du das "Durchprobieren" nicht einer Optimierungsroutine, wie z.B. fminunc oder fmincon?
Sorry aber ich weiß nicht wirklich was es mir bringen soll.
Ich habe ja nur Messdaten!
D.h. ich habe keine Funktion auf die ich hinoptimieren kann!
Sprich erst mein Algorithmus liefert mir eine Übertragungsfunktion
@all
Wenn vielleicht jemand Erfahrung mit der sim-Befehl in parfor hat sprich wie ich dem die Variablen übergeben kann. das würde mich schon weiter bringen
Was es dir, wenn ich die Situation richtig verstanden habe, bringt:
anstatt in einer for-Schleife "blind" verschiedene Parametersätze zu testen, systematisch nach den besten Parametern zu suchen. Die Zielfunktion ist genau die von dir beschriebene Gütefunktion.
Was spricht gegen das Übernehmen der Codezeilen in den Hauptteil des Codes? Mich würde wundern, wenn das mit einer "normalen" for-Schleife funktioniert. Was genau meinst du mit "Es geht einzeln schon"?
Ok, die Gütefunktion setzt sich halt so zusammen, dass ich einfach die Messdaten mit den Werten aus der Simulation also mit der identifizierten Übertragungsunkftion vergleiche und einfach die Differenz bezüglich der einzelnen Messpunkte bilde und summiere.
Von daher ist das kein wirlich es Gütefunktional.
Ich muss gestehen ich verstehe auch nicht ganz was ich genau in der Hauptteil übernehmen soll . Irgendwie reden wir aneinander vorbei.
Wenn ich die Simulation ohne Schleife teste geht es super, wenn ich die Simulation dann in die parfor-Schleife hänge. Kommt eben der Fehler .
wieso ist es kein Gütefunktional? Du willst doch den Fehler klein bekommen, und das in Abhängigkeit der Parameter? Anders gesagt, du willst den Fehler bzw. die Summe der Fehler minimieren.
stimmt, weiters habe ich aber noch ein zweiteres kriterium, nämlich, dass der endwert halbwegs passt (von 10 - Ende).
Von 5.5 -10 wird die Dynamik bewertet.
siehe Image im Anhang
da sich ja die identifizierte Übertragungsfunktion in jedem Schleifendurchlauf ändert, wird ja die Simulation mit dieser auch immer ein anderes y_identifed geben, wenn ich das nicht in der Schleife habe , ändert sich das ja nicht mehr?!
stimmt, weiters habe ich aber noch ein zweiteres kriterium, nämlich, dass der endwert halbwegs passt (von 10 - Ende).
Von 5.5 -10 wird die Dynamik bewertet.
Das lässt sich ja in die Zielfunktion einbauen - genauso, wie du es momentan auch machst.
Zitat:
da sich ja die identifizierte Übertragungsfunktion in jedem Schleifendurchlauf ändert, wird ja die Simulation mit dieser auch immer ein anderes y_identifed geben, wenn ich das nicht in der Schleife habe , ändert sich das ja nicht mehr?!
Es wird doch nach wie vor in der par(for)-Schleife abgearbeitet.
Tud mir leid, Harald kannst mal schnell so einen Art Pseudo-Code schreiben wie du das genau meinst?
brauchen eh nur die wichtigsten Funktionen drinnen sein, keine Details
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.