Zeitmessungen auf Multicoresystemen
-
Hallo,
es gibt Zeitstempelfunktionen die auf Multicoresystemen extrem schwanken.
Momentan benutze ich gettimeofday(). Die Frage ist nun, ob es hier starke Schwankungen (auf Multicoresystemen) gibt, die nicht vertretbar sind.Danke im Voraus!
L. G.
Steffo
-
-
Genau das wollte ich vermeiden.
Unser Prof schreibt zu den möglichen Attributen:CLOCK_REALTIME: Dieser Zeitgeber repräsentiert die systemweite, aktuelle Zeit. Er reagiert auf Zeitsprünge, sowohl vorwärts als auch rückwärts, die beispielsweise beim Aufwachen (Resume) nach einem Suspend (Schlafzustand des gesamten Systems) ausgelöst werden. Er reagiert ebenfalls auf unterschiedliche Taktungen, die beispielsweise durch NTP erfolgen. Dieser Zeitgeber liefert die Sekunden und Nanosekunden seit dem 1.1. 1970 UTC (Unixzeit) zurück.
CLOCK_MONOTONIC: Dieser Zeitgeber läuft entsprechend seiner Auflösung stets vorwärts, ohne dabei Zeitsprünge zu vollziehen. Er ist also unabhängig von der mit Superuserprivilegien zu verändernden Systemuhr. Allerdings reagiert dieser Zeitgeber auf Modifikationen der Taktung, die beispielsweise durch NTP erfolgen.
CLOCK_MONOTONIC_RAW: Dieser Zeitgeber ist linuxspezifisch. Er reagiert weder auf Zeitsprünge noch auf in Betrieb geänderte Taktungen (NTP).
CLOCK_PROCESS_CPUTIME_ID: Dieser Zeitgeber erfasst die Verarbeitungszeit (Execution Time) des zugehörigen Prozesses. Das funktioniert aber nur zuverlässig auf Single-Core-Systemen beziehungsweise wenn sichergestellt werden kann, dass keine Prozessmigration stattfindet.
CLOCK_THREAD_COMPUTE_ID: Dieser Zeitgeber erfasst die Verarbeitungszeit (Execution Time) des zugehörigen Threads. Das funktioniert aber nur zuverlässig auf Single-Core-Systemen beziehungsweise wenn sichergestellt werden kann, dass keine Prozessmigration stattfindet.Das einzige was für mich in Frage kommt, ist CLOCK_MONOTONIC, aber bevor ich alles umstelle, möchte ich wissen, ob etwas gegen gettimeofday() spricht.
-
Was möchtest du erreichen?
CLOCK_MONOTONIC ist so ziemlich das genaue Gegenteil von gettimeofday, es ist überhaupt nicht klar, was du haben möchtest.
-
Ich möchte Performancemessungen machen.
Die Zeitstempel werden innerhalb verschiedener Threads aufgezeichnet und am Ende des Programms ausgewertet. Dabei möchte ich vermeiden, dass gewisse Zeitstempelfunktionen Probleme mit Multithreading und Multiprozessorsystemen haben.
clock_gettime mit dem Parameter CLOCK_THREAD_COMPUTE_ID ist z. B. nicht geeignet, was ich auch schon praktisch feststellen musste, da die Schwankungen einfach zu groß sind.L. G.
Steffo
-
Hochauflösende Performancemessungen, dazu ist clock_gettime gemacht und gettimeofday absolut nicht gemacht.
-
Welchen Parameter sollte ich da nehmen? CLOCK_MONOTONIC?
gettimeofday() bietet ja eine Auflösung im Mikrosekundenbereich. Ist das nicht ausreichend?
-
Wenn C++11 zur Verfuegung steht: http://en.cppreference.com/w/cpp/chrono/high_resolution_clock
-
Warum gettimeofday schon mal keine gute Idee ist: Mach ein Programm, dass die Startzeit misst, dann lange wartet und nochmal die Zeit misst und dir die Differenz ausgibt. Während das Programm wartet, stellst du einfach mal die Systemzeit auf deinem System um. zB 3 Stunden zurück oder wechsle von Sommer- zu Winterzeit...
Also nimm das Tool was speziell für deinen Zweck gemacht wurde (clock_gettime) und missbrauche nicht gettimeofday.
-
rüdiger schrieb:
Also nimm das Tool was speziell für deinen Zweck gemacht wurde (clock_gettime) und missbrauche nicht gettimeofday.
OK, aber mit welchen Parametern? CLOCK_MONOTONIC?
@knivil: Absolutes NoGo. Hab meine Vorgaben.
-
Steffo schrieb:
gettimeofday() bietet ja eine Auflösung im Mikrosekundenbereich. Ist das nicht ausreichend?
Die Auflösung mag zwar Mikrosekunden sein, aber probier mal aus, was der Tick ist. Und natürlich das, was knivil gesagt hat. Für Performancemessungen möchtest du schließlich auch nicht die Wall-Clock-Time, sondern in der Regel die CPU-Zeit. Und noch viel mehr bietet es sich an, einen fertigen Profiler zu benutzen. Warum machst du das nicht?
-
SeppJ schrieb:
Die Auflösung mag zwar Mikrosekunden sein, aber probier mal aus, was der Tick ist. Und natürlich das, was knivil gesagt hat. Für Performancemessungen möchtest du schließlich auch nicht die Wall-Clock-Time, sondern in der Regel die CPU-Zeit.
Hmm, ok, aber wie gesagt: Welcher Parameter ist hier geeignet? CLOCK_MONOTONIC?
Und noch viel mehr bietet es sich an, einen fertigen Profiler zu benutzen. Warum machst du das nicht?
gprofiler misst die sleeps nicht mit - generell nur user space zeugs -, außerdem muss ich auch Zeiten von Teilanweisungen innerhalb einer Funktion messen.
-
Kurz ja.
Desweiteren gibt es unter Linux auch noch /bin/time (nein, nicht das shell buil-in). Das sagt dir, wieviel Zeit im userspace gebraucht wurde, wieviel fuer I/O draufgegangen ist, Speicherallokationen, ....
-
OK, dann nehm ich CLOCK_MONOTONIC, thx!