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

Plots beschleunigen

 

robertradar
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2017, 13:38     Titel: Plots beschleunigen
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2017, 14:28     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.01.2017, 00:51     Titel: Re: Plots beschleunigen
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2017, 21:28     Titel:
  Antworten mit Zitat      
Danke für eure Antworten.

Derzeit passiert in meiner Software folgendes:

Code:

%Berechnungen, um OccupancyMap zu erstellen
image(ImageParam.yAxis,ImageParam.xAxis,OccupancyMap_linear,'CDataMapping','scaled');
drawnow


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

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.01.2017, 23:48     Titel:
  Antworten mit Zitat      
Hallo,

ein Beispiel zur Aktualisierung der Graphik:
Code:
figure
tic
for I = 1:1000
    image(rand(1000), 'CDataMapping','scaled')
    drawnow
end
toc
%%
figure
tic
im = image(rand(1000), 'CDataMapping','scaled');
for I = 2:1000
    im.CData = rand(1000);
    drawnow
end
toc

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2017, 12:00     Titel:
  Antworten mit Zitat      
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

Code:

im_1 = image(...)
im_2 = image(...)
 


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:
Code:

>> opengl info
                          Version: '…'
                           Vendor: '…'
                         Renderer: '…'
            RendererDriverVersion: '…'
        RendererDriverReleaseDate: '…'
                   MaxTextureSize: 16384
                           Visual: '…'
                         Software: '…'
             HardwareSupportLevel: '…'
        SupportsGraphicsSmoothing: 1
    SupportsDepthPeelTransparency: 1
       SupportsAlignVertexCenters: 1
                       Extensions: {208x1 cell}
               MaxFrameBufferSize: 16384
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2017, 13:45     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2017, 14:02     Titel:
  Antworten mit Zitat      
Hallo,

die Berechnugn von OccupancyMap ist ziemlich aufwendig, weswegen ich an Zeitersparnis interessiert bin.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2017, 20:29     Titel:
  Antworten mit Zitat      
Hallo,

wenn die Berechnung der aufwändige Teil ist, dann bringt es doch nichts, die Darstellung zu beschleunigen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.01.2017, 01:19     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.01.2017, 17:46     Titel:
  Antworten mit Zitat      
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
Code:

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:
Code:
figure('Renderer', 'OpenGL')

In der Dokumentation findest Du einiges darüber:
Code:
docsearch opengl


Wenn Du Deinen Code postest, könnte man sicherlich Vorschläge zur Beschleunigung machen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2017, 17:32     Titel:
  Antworten mit Zitat      
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
Code:

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:
Code:
figure('Renderer', 'OpenGL')

In der Dokumentation findest Du einiges darüber:
Code:
docsearch opengl


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
Code:
figure('Renderer', 'OpenGL')

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

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.01.2017, 22:43     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
robertradar
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 17.10.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2017, 23:41     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.01.2017, 02:48     Titel:
  Antworten mit Zitat      
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
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.