|
|
Programm 100mal durchlaufen lassen |
|
Laura* |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.09.2015, 10:42
Titel: Programm 100mal durchlaufen lassen
|
|
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?
Vielen Dank schonmal für Eure Hilfe,
lg Laura
|
|
|
|
|
Epfi |
Forum-Meister
|
|
Beiträge: 1.134
|
|
|
|
Anmeldedatum: 08.01.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.09.2015, 11:23
Titel:
|
|
|
|
|
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.
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 24.09.2015, 11:30
Titel: Re: Programm 100mal durchlaufen lassen
|
|
|
|
|
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
|
|
|
Mmmartina |
Forum-Meister
|
|
Beiträge: 745
|
|
|
|
Anmeldedatum: 30.10.12
|
|
|
|
Wohnort: hier
|
|
|
|
Version: R2020a
|
|
|
|
|
|
Verfasst am: 24.09.2015, 20:47
Titel: Re: Programm 100mal durchlaufen lassen
|
|
|
|
|
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))
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 26.09.2015, 11:55
Titel: Re: Programm 100mal durchlaufen lassen
|
|
|
|
|
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
|
|
|
|
|
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 - 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.
|
|