2016-05-07 18 views
0

Um die Gesamtzeit für ein c-Programm zu berechnen, verwenden wir normalerweise die Funktionen clock() und time() in der Header-Datei <time.h>.
Die clock() misst die Anzahl der Ticks, die die CPU verwendet hat (CLOCKS_PER_SEC) Danach können wir die Differenz zwischen den Anfangs- und Endpunkten des Code-Snippets, das wir berechnen möchten, einfach durch CLOCKS_PER_SEC teilen. Dies hilft uns, die Zeit in Sekunden zu erhalten
Auch time(null) gibt die Anzahl der ganzen Sekunden seit einem bestimmten Zeitpunkt zurück. verwiesen here

Jetzt ist hier mein Problem. Um die Gesamtzeit zu berechnen, die ich für ein normales c-Programm benötige (um die Beschleunigung der Operation zu dokumentieren), verwende ich alle Prozessoren, die in meinem System vorhanden sind. Was ist der beste Weg, um die Zeit zu berechnen. Als clock() würde nur die kumulative Zeit für die Ausführung des Programms auf jedem Prozessor, im Grunde
(actual_time_taken x omp_get_max_threads())


zurückgeben und Zeit() ist eine sehr vage Methode zu berechnen, da ich in Berechnung der Zeit in Millisekunden interessiert bin.Zeitberechnung für parallele Programme

+0

IMHO ist dies ein Duplikat von https://stackoverflow.com/questions/12392278/measure-time-in-linux-time-vs-clock-vs-getrusage-vs-clock-gettime-vs-gettimeof. Meine persönliche Empfehlung wäre "clock_gettime" (CLOCK_MONOTONIC_RAW ... 'falls vorhanden. Leider gibt es keine Wunderwaffe - es ist immer ein Kompromiss zwischen der Qualität der Uhr und Portabilität und natürlich den Anforderungen. – Zulan

+3

habe ich nicht gesehen ein Grund für die Vermeidung von omp_get_wtime Wenn Sie spezielle Probleme mit der Timerqualität aufgrund Ihres Betriebssystems haben, sollte dies eine vernünftige Lösung darstellen.Zum Beispiel könnte es unter Windows auf der API frictionperformance basieren – tim18

Antwort

3

OpenMP bietet omp_get_wtime() für genau dies. Gibt es einen Grund, diese Funktion nicht in Ihrem Code zu verwenden?

-1

Da Sie in C programmieren, sollten Sie die Funktion getrusage() verwenden. Dadurch werden die System- und Benutzermoduszeiten für den gesamten Prozess und seine untergeordneten Elemente, den aktuellen Prozess oder alle Threads angezeigt. Nennen Sie es einmal am Anfang und einmal am Ende, dann nehmen Sie den Unterschied.

+0

Ich fürchte, diese Antwort ist auf vielen Ebenen falsch : 1) 'TICKS_PER_SEC' hat nichts mit der CPU-Frequenz zu tun. Es ist ein Header '# define', also kann er sich nicht auf die Frequenz beziehen. Daher ist es für "clock" unmöglich, den Zeitstempelzähler (TSC) direkt zu verwenden. 2) Moderne CPUs haben [Konstante TSC] (https://en.m.wikipedia.org/wiki/Time_Stamp_Counter#Implementation_in_variable_processors), so dass Sie TSC trotz Frequenzskalierung verwenden können. – Zulan

+0

Es scheint eine einfache Fehlbezeichnung mit 'CLOCKS_PER_SEC' zu sein, die auf modernen CPUs als '1M' definiert ist und mit einer Differenz der doppelten Werte von' clock()' verwendet werden kann, um die Anzahl der Sekunden der Operation zu bestimmen. –

+0

@Zulan: OK, ich habe diesen Teil meiner Antwort gelöscht und den Teil verlassen, von dem ich mir ziemlich sicher bin, dass er immer noch ein guter Rat ist. :) Vielen Dank. –

Verwandte Themen