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

Programm 100mal durchlaufen lassen

 

Laura*

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2015, 10:42     Titel: Programm 100mal durchlaufen lassen
  Antworten mit Zitat      
Hallo liebe Matlab-Freunde,

ich schreibe gerade meine Abschlussarbeit in Numerik und komme mit Matlab nicht weiter.

Ich habe ein Verfahren zur Approximation implementiert, von dem nicht nur der maximale Fehler wichtig ist, sondern auch die cpu. Nun würde ich gerne das Programm 100mal laufen lassen, um einen durchschnittlichen cpu-Wert angeben zu können.

Wenn ich das über eine for-Schleife mache, dann stimmt immer nur der erste Vektoreintrag und alle anderen sind extrem kleiner.

Habt ihr eine Idee, wie ich das machen könnte, ohne das Programm von Hand 100mal starten zu lassen und den Wert einzeln zu speichern um den Mittelwert zu berechnen? Wink

Vielen Dank schonmal für Eure Hilfe,
lg Laura


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2015, 11:23     Titel:
  Antworten mit Zitat      
Am besten ist es vielleicht, einfach die Additionen, Multiplikationen, Divisionen, ... zu zählen. Was die Rechner letztendlich aus Deinem Programm machen ist nicht nur von der Programmiersprache (dem Compiler) abhängig, sondern auch noch davon, was der Prozessor so für Rechenoperationen durchführen kann. Es gibt Prozessoren, die haben einen Befehl, um zwei Zahlen zu multiplizieren und das Ergebnis zu einer weiteren Zahl hinzuzählen, andere haben diesen Befehl nicht. Und mal dauert dieser Befehl nur 2 Takte, auf anderen Prozessoren vielleicht 5 oder 20 Takte...
Und wenn man 100 mal das gleiche rechnet, hat man eine gute Chance, dass der Compiler das merkt und 99 dieser Durchläufe einfach wegoptimiert.

So einen Versuchslauf auf Deinem Rechner kannst Du bestenfalls dazu benutzen, die Performance verschiedener Verfahren miteinander zu vergleichen. Und die Ergebnisse gelten dann auch nur für Deinen Rechner...

Am besten ist es vermutlich, wenn Du für Deine Berechnung in jedem Schleifendurchlauf immer andere Werte einsetzt und das Ergebnis immer an anderer Stelle speicherst. Dann lässt sich das schon nicht mehr einfach wegoptimieren. Aber sinnvolle Aussagen kann man bei sowas eigentlich nur treffen, wenn man wirklich tief in die Funktionsweise des Compilers reinguckt und weiß, an welcher Stelle wie optimiert wird.

Vielleicht einfach C benutzen, da kann man die Optimierungen im Compiler in der Regel abschalten und bekommt dann auch halbwegs reproduzierbare Ergebnisse. Die Prozessorabhängigkeit bleibt Dir aber auch dann erhalten.
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: 24.09.2015, 11:30     Titel: Re: Programm 100mal durchlaufen lassen
  Antworten mit Zitat      
Hallo Laura*

Zitat:
Ich habe ein Verfahren zur Approximation implementiert, von dem nicht nur der maximale Fehler wichtig ist, sondern auch die cpu.

Was heißt "die cpu"? Meinst Du die Laufzeit auf einer bestimmten CPU?

Zitat:
Nun würde ich gerne das Programm 100mal laufen lassen, um einen durchschnittlichen cpu-Wert angeben zu können.

Wieso genau 100 mal? Wenn das Programm 1ms benötigt, bist Du immer noch in einem Bereich, in dem Laufzeitmessungen mit Matlab sehr ungenau sind.

Zitat:
Wenn ich das über eine for-Schleife mache, dann stimmt immer nur der erste Vektoreintrag und alle anderen sind extrem kleiner.

Da wir nun nicht wissen können, welchen "Vektoreintrag" Du meinst, kann ich nur raten: Dann hast Du einen Bug im Code. Den musst Du natürlich zuerst mal beheben, bevor eine Laufzeitmessung sinnvoll ist.

Vielleicht hast Du die Methode als Script implementiert und bestehende Variablen ändern das Verhalten des Code. Sattdessen eine Funktion zu verwenden, wäre deutlich sinnvoller. Außerdem kann da auch effizienter sein, also deutlich schneller laufen, denn Matlab's JIT-Accelerator kann in Funktionen deutlich besser optimieren.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 24.09.2015, 20:47     Titel: Re: Programm 100mal durchlaufen lassen
  Antworten mit Zitat      
Vielleicht könntest du mal genauer erklären, was du unter "durchschnittlichem CPU-Wert" verstehst. Die Laufzeit? Und wie bestimmst du diese?

Wie viele Takte die CPU braucht, um deinen Code abzuarbeiten wirst du mit Matlab nicht bestimmen können. Dazu müsstest du auf Assemblerebene schauen, wie dein Code umgesetzt wird und "mitzählen".
Wobei auch dass dann vom Compiler (Stichwort Optimierung), der jweiligen CPU (wie viele Kerne, parallelisierung), weiteren Programmen im Hintergrund, ... abhängt.

Jan S hat Folgendes geschrieben:
Zitat:
Wenn ich das über eine for-Schleife mache, dann stimmt immer nur der erste Vektoreintrag und alle anderen sind extrem kleiner.

Da wir nun nicht wissen können, welchen "Vektoreintrag" Du meinst, kann ich nur raten: Dann hast Du einen Bug im Code. Den musst Du natürlich zuerst mal beheben, bevor eine Laufzeitmessung sinnvoll ist.


Ich würde an der STelle nicht an einen Bug denken, sondern, wie auch von Epfi angemerkt an eine Optimierung "im Hintergrund".

Das von dir geschriebene Programm wird auf tieferer (=Assembler)Ebene meist deutlich anders abgelaufen. Wenn eine Schleife 100mal durchlaufen werden soll und jedesmal ein bestimmter Wert berechnet wird, wird der Compiler dies erkennen und nur 1x diese Berechnung durchführen.
Das wäre dann dein erster Schleifendurchlauf mit größerem Zeitbedarf. Alle anderen Durchläufe greifen dann auf die bereits berechneten Werte wieder zu.
Denn Ziel ist ja normalerweise, so wenig Prozessorleistung zu benötigen, wie möglich.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
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: 26.09.2015, 11:55     Titel: Re: Programm 100mal durchlaufen lassen
  Antworten mit Zitat      
Hallo Mmmartina,

Laura* hatte geschrieben:
Zitat:
Wenn ich das über eine for-Schleife mache, dann stimmt immer nur der erste Vektoreintrag und alle anderen sind extrem kleiner.

Das klingt in meinen Ohren so, als würden irgendwelche "Einträge" nicht stimmen, also falsch sein. Ob Laura* nun die Laufzeiten oder die Ergebnisse ihrer Berechnung meint, ist noch nicht klar.

Der "Compliler" von Matlab läuft, wenn das M-File das erste mal eingelesen wird. Während der Laufzeit kann die JIT-Acceleration noch ein paar Dinge dynamisch ändern, um den Code schneller laufen zu lassen, das ist dann aber keine "Kompilierung".

Die Anzahl der Processor-Ticks für ein Programm lässt sich heutzutage kaum noch sinnvoll bestimmen. Wenn die Daten in den Prozessor-Cache passen, werden sie viel schneller bearbeitet als wenn der Prozessor erstmal darauf warten muss, dass sie aus dem langsamen RAM kopiert werden. Wenn der Rechner heiß wird, schaltet sich die Frequenz runter, so dass das Warten auf das RAM weniger Ticks benötigt. Dann wären es zwar weniger Ticks, dafür aber eine längere Laufzeit.
Wieviele Threads ein Prozess bekommt, hängt auch davon ab, was das Betriebssystem in der Zeit noch ausführt.
Im Falle einer IF-Abfrage kann der Prozessor spekulieren und in seiner Pipeline schon den einen oder anderen Branch weiter bearbeiten. Wenn die Spekulation falsch war, werden die Ergebnisse dann verworfen. Bei Matlab hat man aber keine Möglichkeit dem Rechner mit zu teilen, dass der eine Zweig nur sehr unwahrscheinlich ist. Im schlimmsten Fall sind alle Spekulationen falsch, was sich messbar auf die Laufzeit auswirken kann.

Ob ein Algorithmus z.B. die Komplexität O2 oder O3 hängt, also für doppelt so große Daten 4 oder 8 mal so viel Laufzeit benötigt, hängt deswegen von sehr vielen Faktoen ab. Falls die doppelt so großen Daten nicht mehr ins RAM passen sondern in den virtuellen Speicher auf der Festplatte geschoben werden, kann der Code 1000 mal langsamer laufen.

Zitat:
Wenn eine Schleife 100mal durchlaufen werden soll und jedesmal ein bestimmter Wert berechnet wird, wird der Compiler dies erkennen und nur 1x diese Berechnung durchführen.

Das ist leider im Allgemeinen in Matlab nicht so. Dafür müsste ein Rechner auch ganz schön schlau sein.

Beim ersten Aufruf eines M-Files benötig der Zugriff auf die Festplatte und die Kompilierung eine Menge Rechenzeit. Genau deshalb ist es nötig vor einer Laufzeitmessung den Rechner "warmlaufen" zu lassen und unbedingt auf clear all zu verzichten, weil dies ja wieder alle Funktionen aus dem Speicher löscht.

Diese Probleme haben aber alle nichts mit Matlab zu tun. Du schreibst aber, dass Du mit Matlab nicht weiter kommst. Bitte erkläre dann das Problem noch mal genauer.

Gruß, Jan
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.