|
robertradar |
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 17.10.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 13.01.2017, 12:38
Titel: Plots beschleunigen
|
|
Hallo,
ich habe ein Programm, in dem Plots in Echtzeit visualisiert werden. Dafür nutze ich den auf ein CPU-Array angewandten image-Befehl und drawnow.
Laut dem Profiler geht sehr viel Zeit in der Zeile drawnow verloren. Mein Ziel ist es nun, diese Zeit zu verkürzen.
Ich bin im Besitz der ParallalComputing Toolbox. Gibt es dahingehend eventuell eine Möglichkeit, mein Ziel zu erreichen, etwa durch Nutzung eines GPU-Arrays?
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 13.01.2017, 13:28
Titel:
|
|
Hallo,
poste bitte Beispielcode.
Wie hoch ist die Auflösung der Bilder?
Verwendest du in der Schleife den image-Befehl?
Es kann deutlich schneller sein, die Bilddaten zu ersetzen.
Zitat: |
Gibt es dahingehend eventuell eine Möglichkeit, mein Ziel zu erreichen, etwa durch Nutzung eines GPU-Arrays? |
Im Zweifelsfall mal ausprobieren, dürfte auch sehr von deiner GPU abhängen. Ich würde eher auf die vorherigen Ansätze zählen.
Grüße,
Harald
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 13.01.2017, 23:51
Titel: Re: Plots beschleunigen
|
|
Hallo robertradar,
Wenn die Zeit beim
drawnow
benötigt wird, bedeutet das nur, dass das Update der Bildschirm-Ausgabe aufwändig ist. Daran kann auch ein GPU-Array nichts ändern und parallelisieren lässt sich das auch nicht.
Eine Hilfe könnte es sein, einen anderen Renderer zu verwenden, die Position vorhandener Elemente zu ändern, statt neue zu erstellen und bei OpenGL einen Hardware-Treiber zu verwenden.
Gruß, Jan
|
|
|
robertradar |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 17.10.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 15.01.2017, 20:28
Titel:
|
|
Danke für eure Antworten.
Derzeit passiert in meiner Software folgendes:
Das Ganze wiederholt sich alle 80 ms, ist also eine Echzeit-Anwendung. ImageParam.yAxis und ImageParam.xAxis liegen jeweils im Bereich von 200 bis 1000.
Wie ändere ich den Renderer? Was genau ist OpenGL? Die Position vorhandener Elemente wird geändert und neue kommen hinzu. Wie kann ich aber da den image-Befehl umgehen?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 15.01.2017, 22:48
Titel:
|
|
Hallo,
ein Beispiel zur Aktualisierung der Graphik:
Bei mir benötigt die erste Variante 30ms pro Bild, die zweite 20ms.
Zitat: |
ImageParam.yAxis und ImageParam.xAxis liegen jeweils im Bereich von 200 bis 1000. |
Welche Auflösung die Bilder haben weiß ich nun immer noch nicht. Das wären die Dimensionen von OccupancyMap_linear.
Ändert sich "nur" OccupancyMap_linear oder auch die anderen Variablen?
Zitat: |
Wie ändere ich den Renderer? Was genau ist OpenGL? |
Bitte bei solchen Fragen auch mal Google bemühen. Dann findest du z.B. dies:
https://de.mathworks.com/help/matlab/ref/figure-properties.html
Grüße,
Harald
|
|
|
robertradar |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 17.10.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.01.2017, 11:00
Titel:
|
|
Den ersten Tipp konnte ich nun umsetzen. Er beschleunigt mein Programm um fast 10 %.
Da der Bediener zwischen zwei verschiedenen Anzeigeformaten wechseln kann, habe ich auch zwei unterschiedliche "groot". Dabei ist mir aufgefallen, dass ich in meinem Workspace nicht mehr als ein image-Objekt speichern kann. Das heiß konkret, bei
wird im_1 gelöscht. Ist das so normal?
Es ändert sich nur OccupancyMap_linear, die anderen beiden Werte nicht. Die Dimension der Variable bleibt konstant und ist je nach Setting etwa 200*400.
Das Thema OpenGL scheint ja sehr weitläufig zu sein. Ich nutze Matlab 2015b auf einem "modernen" Windows7-Rechner. Kann man allein darauf bassierend sagen, was die optimalen Einstellungen sind?
EDIT:
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 16.01.2017, 12:45
Titel:
|
|
Hallo,
groot ist im Grunde die MATLAB-Session. Wie du da zwei gleichzeitig haben kannst und was das mit der Fragestellung zu tun hat, verstehe ich nicht.
Was heißt "im Workspace haben"? Die Variable im_1 sollte weiter existieren, nur das Bild, auf das sie verweist, nicht mehr. Das ist das normale Verhalten der Visualisierungsbefehle, außer man verwendet
hold on
.
Mich verwundert, dass du dann Probleme mit Anwendungen in 80ms hast, da bei mir wie gesagt 20-30ms pro Aktualisierung notwendig waren.
Wie lange läuft denn mein Beispielcode bei dir?
Grüße,
Harald
|
|
|
robertradar |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 17.10.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.01.2017, 13:02
Titel:
|
|
Hallo,
die Berechnugn von OccupancyMap ist ziemlich aufwendig, weswegen ich an Zeitersparnis interessiert bin.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 16.01.2017, 19:29
Titel:
|
|
Hallo,
wenn die Berechnung der aufwändige Teil ist, dann bringt es doch nichts, die Darstellung zu beschleunigen?
Grüße,
Harald
|
|
|
robertradar |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 17.10.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 17.01.2017, 00:19
Titel:
|
|
Hi,
doch, es macht Sinn da ich durch die Umsetzung des Tipps etwa 5 ms je Zyklus spare. Ich versuche beide Teile, also Berechnung und Visualisierung, zu optimieren.
Den Hinweis mit dem Renderer habe ich leider noch nicht vollständig verstanden. Was genau muss getan werden?
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 17.01.2017, 16:46
Titel:
|
|
|
|
|
Hallo robertradar
Zitat: |
Da der Bediener zwischen zwei verschiedenen Anzeigeformaten wechseln kann, habe ich auch zwei unterschiedliche "groot". |
Wie schon gesagt: Das ist nicht sinnvoll. Es gibt immer nur ein
groot
Objekt. Deswegen ja der Name: "root". Bitte erkläre also, von welchen Objekten Du zwei hast.
Zitat: |
Dabei ist mir aufgefallen, dass ich in meinem Workspace nicht mehr als ein image-Objekt speichern kann. |
Image-Objekte werden immer grafisch dargestellt und nicht im WorkSpace gespeichert. Meinst Du also zwei Image-Objekte im gleichen AXES-Objekt? Das kann daran liegen, ob die "NextPlot"-Eigenschaft des AXES auf "add" oder "replace" gesetzt ist. Siehe dazu
hold
.
Zitat: |
Das heiß konkret, bei
wird im_1 gelöscht. Ist das so normal? |
Was genau bedeutet "gelöscht"?
Zitat: |
Das Thema OpenGL scheint ja sehr weitläufig zu sein. Ich nutze Matlab 2015b auf einem "modernen" Windows7-Rechner. Kann man allein darauf bassierend sagen, was die optimalen Einstellungen sind? |
Nein. OpenGL ist ein Grafik-Treiber, darum spielt hauptsächlich duie Grafikkarte eine Rolle. Moderne Grafikkarten liefern Treiber mit, auf die Matlab direkt zugreifen kann und so wird die Darstellung deutlich beschleunigt. Auf alten Karten nutzt Matlab dagegen einen Software-Treiber, der stabiler läuft, aber viel langsamer ist.
Leider sind bei Deinem geposteten Output von "opengl info" alle relevanten Strings als '...' angezeigt worden.
Um den OpenGL-Renderer zu verwenden, musst Du ihn einfach nur im figure aktivieren:
In der Dokumentation findest Du einiges darüber:
Wenn Du Deinen Code postest, könnte man sicherlich Vorschläge zur Beschleunigung machen.
Gruß, Jan
|
|
|
robertradar |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 17.10.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.01.2017, 16:32
Titel:
|
|
|
|
|
Vielen Dank für diese ausführliche Antwort.
Jan S hat Folgendes geschrieben: |
Hallo robertradar
Zitat: |
Da der Bediener zwischen zwei verschiedenen Anzeigeformaten wechseln kann, habe ich auch zwei unterschiedliche "groot". |
Wie schon gesagt: Das ist nicht sinnvoll. Es gibt immer nur ein
groot
Objekt. Deswegen ja der Name: "root". Bitte erkläre also, von welchen Objekten Du zwei hast.
Zitat: |
Dabei ist mir aufgefallen, dass ich in meinem Workspace nicht mehr als ein image-Objekt speichern kann. |
Image-Objekte werden immer grafisch dargestellt und nicht im WorkSpace gespeichert. Meinst Du also zwei Image-Objekte im gleichen AXES-Objekt? Das kann daran liegen, ob die "NextPlot"-Eigenschaft des AXES auf "add" oder "replace" gesetzt ist. Siehe dazu
hold
.
Zitat: |
Das heiß konkret, bei
wird im_1 gelöscht. Ist das so normal? |
Was genau bedeutet "gelöscht"?
|
Das Thema hat sich erledigt. Den Image-Befehl kann ich nun wie gesagt einsparen und gewinne dadurch einiges an Zeit.
Jan S hat Folgendes geschrieben: |
Zitat: |
Das Thema OpenGL scheint ja sehr weitläufig zu sein. Ich nutze Matlab 2015b auf einem "modernen" Windows7-Rechner. Kann man allein darauf bassierend sagen, was die optimalen Einstellungen sind? |
Nein. OpenGL ist ein Grafik-Treiber, darum spielt hauptsächlich duie Grafikkarte eine Rolle. Moderne Grafikkarten liefern Treiber mit, auf die Matlab direkt zugreifen kann und so wird die Darstellung deutlich beschleunigt. Auf alten Karten nutzt Matlab dagegen einen Software-Treiber, der stabiler läuft, aber viel langsamer ist.
Leider sind bei Deinem geposteten Output von "opengl info" alle relevanten Strings als '...' angezeigt worden.
Um den OpenGL-Renderer zu verwenden, musst Du ihn einfach nur im figure aktivieren:
In der Dokumentation findest Du einiges darüber:
Wenn Du Deinen Code postest, könnte man sicherlich Vorschläge zur Beschleunigung machen.
Gruß, Jan |
[/quote]
Wie ich die entsprechenden Strings sichtbar mache, weiß ich leider nicht. Jedenfalls hat
keine Änderung erwirkt.
Laut Profiler steckt nach wie vor sehr viel Zeit in der Zeile "drawnow", genau gesagt etwa 8 s bei etwas mehr als 300 Aufrufen. Wie könnte man das weiter verbessern?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 19.01.2017, 21:43
Titel:
|
|
Hallo,
drawnow erzwingt eine Aktualisierung der Figure.
Pro Bild dauert das bei dir also rund 25ms. Das finde ich nicht "sehr viel Zeit".
Jan schrieb übrigens:
Zitat: |
Wenn Du Deinen Code postest, könnte man sicherlich Vorschläge zur Beschleunigung machen. |
Grüße,
Harald
|
|
|
robertradar |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 57
|
|
|
|
Anmeldedatum: 17.10.16
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.01.2017, 22:41
Titel:
|
|
Hallo,
das "sehr viel" ist in Relation zu den anderen Programmteilen zu verstehen.
Mein Code ist inzwischen mehrere 1000 Zeilen lang und außerdem Kern meiner Promotion, so dass ich da nicht alles hier rein stellen darf und will. Von daher hatte ich gehofft, man könne mir bereits so konkrete Hinweise geben.
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 20.01.2017, 01:48
Titel:
|
|
Hallo,
es ist nicht ungewöhnlich, das ein Programmteil lange im Verhältnis zu anderen braucht.
E ist unnötig, das vollständige Programm reinzustellen. Es reicht vollkommen, Code zur Verfügung zu stellen, mit dem das Verhalten reproduziert werden kann, damit man anhanddessen mögliche Verbesserungen testen kann.
Es wird aber nunmal irgendwann einen Punkt geben, an dem die Verbesserungsmöglichkeiten erschöpft sind. Wäre es denn beispielsweise eine Möglichkeit, nur jeden 2. Frame zu rendern (oder z.B. eine Mittelwertbildung über eine gewisse Anzahl Frames durchzuführen)? Die Aufnahmefähigkeit unserer Augen hat ja auch ihre Grenzen.
Grüße,
Harald
|
|
|
|
|
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 - 2025
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.
|
|