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
Antwort
OpenMP bietet omp_get_wtime()
für genau dies. Gibt es einen Grund, diese Funktion nicht in Ihrem Code zu verwenden?
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.
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
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. –
@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. –
- 1. % Operator für die Zeitberechnung
- 2. PHP Zeitberechnung
- 3. Zeitberechnung in Javascript
- 4. Perl - parallele Programmierung - zwei externe Programme laufen lassen
- 5. System Idle Zeitberechnung mit vC++
- 6. Parallele Aufgabe für Baumstruktur
- 7. Speicherzugriffsmonitor für c-Programme
- 8. Python-Fabric für parallele Verarbeitung
- 9. Beständige Hashtabelle für Ruby-Programme?
- 10. vorbelegen Speicherplatz für Programme verwenden
- 11. Automake Verknüpfung für mehrere PROGRAMME
- 12. Parallele Iteratoren
- 13. Java parallele Berechnung/threading
- 14. Linux-Cluster-Shell für parallele Matlab-Simulation
- 15. Openmp parallele Worshare für zuweisbare Array
- 16. Parallele In-Place-Sortierung für numpy Arrays
- 17. Ist LLVM für parallele Sprachen geeignet?
- 18. Parallele Sequenz der Matrixmultiplikation für die Beschleunigung
- 19. parallele Verarbeitung in Fledermaus-Datei für Schleife
- 20. Parallele Implementierung für mehrere SVDs mit CUDA
- 21. Maximieren parallele Downloads für die Website
- 22. Mehrere parallele. Für jeden Anruf, MemoryBarrier?
- 23. Irgendwelche Vorschläge für verteilte parallele Baumsuchalgorithmen?
- 24. Parallele API für C/C++ unter Windows
- 25. Parallele Ausführung für E/A-gebundene Operationen
- 26. Seltsames Verhalten von Stream.spliterator für parallele Ströme
- 27. Xvfb mehrere Displays für die parallele Verarbeitung?
- 28. Sublime Text mit Konsoleneingabe für C++ - Programme
- 29. Hierarchical Modulnamen für Typ-Level-Programme
- 30. Wird Linker für einfache C-Programme verwendet?
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
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