Ich vergleiche time_point
s aus std::chrono::high_resolution_clock
, die in Threads gemessen wurden, die auf verschiedenen Kernen in einem Prozessor ausgeführt werden. Kann es signifikante Unterschiede geben, wie Verzögerungen oder schnellere/langsamere Uhren? Was spezifiziert der Standard?Can Clocks von Std :: Chrono auf verschiedenen Kernen unterschiedlich sein
Antwort
Ich werde dies speziell auf Ihren Kommentar basiert beantworten, dass Sie diese auf einem ‚Modern‘Intel CPU ausgeführt werden.
Ich werde auch hervorheben, dass dies eine sehr umstrittene Diskussion sein kann, da dies sehr von der CPU und dem Motherboard abhängt. ‚Modern‘ kann ein sehr flüssig Konzept sein :)
Allgemeinen
Speaking Die ‚Moderne‘ Intel CPUs integriert haben einige Mechanismen einheitliche, um sicherzustellen, über Kerne Zecken. Es spielt jedoch auch eine Rolle, auf welchem Betriebssystem Sie laufen. Zum Beispiel werden einige Linux-Kernel den Time Stamp Counter als Quelle verwenden, da sie weniger Overhead haben und auf den (modernen) High Precision Event Timer zurückgreifen, der versucht, den Takt über die Kerne hinweg gleichmäßig zu halten.
Bedenken Sie auch, dass Intel-CPUs über zahlreiche Stromverbrauchs-Utilities verfügen, die die CPU-Taktfrequenz beeinflussen können.
Best Case Annahme
ich für die CONSTANT_TSC Flagge als Teil des /proc/cpuinfo auf Linux überprüfen würde, wie es dann ausgegangen werden kann, dass die TSC in fester Frequenz über Kerne läuft. Aber ... erinnere dich an die obigen Variationen.
Es gibt Maschinenzustandsereignisse wie Stromsparmodus und Maschinenschlafzustand, die eine Änderung der CPU-Taktfrequenz verursachen können. In diesem Fall ist eine Neukalibrierung des TSC erforderlich, und einige Dokumente deuten darauf hin, dass dies nur beim Neustart der Fall ist.
Empfehlung:
Ziel ein Chipsatz und OS und untersuchen die spezifischen documentation. Die meisten Betriebssystemfamilien haben detaillierte Informationen zu den Einzelheiten ihrer Taktquelle.
Je nach Zeitgenauigkeitsanforderungen Sie vielleicht wechseln
clock_gettime(CLOCK_MONOTONIC, ...);
Die std
Uhren haben keine Prozessoraffinität, in der Tat, die meisten Threads auch nicht. Zwei Taktimpulse des gleichen Threads könnten auf verschiedenen Kernen gemacht worden sein.
Auf der Vor-und Nachlauf mit den Messungen verbunden - das wäre nicht anders als die Ausführung einer anderen Anweisung; die üblichen Pipelines etc. können Auswirkungen haben, aber ich halte das nicht für schädlich. Wenn es sich nachteilig auswirken könnte, müssen Sie möglicherweise andere Tools für den Job in Betracht ziehen, z. B. einige spezielle Plattform-Timing-Tools oder CPU-spezifische Anweisungen.
- 1. std :: min std :: Chrono :: Dauer verschiedenen Typen
- 2. std :: Chrono :: System_Clock vs std :: Chrono :: high_resolution_clock Verhalten
- 3. Zeitdifferenzen mit std :: Chrono :: System_Clock/std :: Chrono :: high_resolution_clock
- 4. Implementierung von Vector Clocks
- 5. Std :: Chrono & Boost.Units
- 6. Probleme mit std :: Chrono
- 7. Std :: Chrono berechnen den Unterschied in verschiedenen Verhältnis
- 8. Wie kann dieser Code constexpr sein? (Std :: Chrono)
- 9. Wann ist std :: chrono Epoche?
- 10. BSON Typen und Std :: Chrono
- 11. Korrekte Methode der Verwendung von Std :: Chrono
- 12. Konvertieren von Struct Timespec zu Std :: Chrono ::?
- 13. Schnelle Umwandlung std :: Chrono :: time_point zu/von std :: string
- 14. std :: chrono :: time_point ungültiger Wert
- 15. std :: Chrono: add benutzerdefinierte Dauer
- 16. Std :: Chrono Tage zum aktuellen Datum hinzufügen
- 17. Sollen Konstruktoren auf std :: chrono :: ... :: time_point noexcept sein? (? Oder warum sind sie nicht)
- 18. Warum std :: Chrono :: time_point arithmetics nicht mag?
- 19. Boost :: Asio :: Deadline_timer mit Std :: Chrono Zeitwerte
- 20. Python-Druck funktioniert auf verschiedenen Servern unterschiedlich
- 21. PHP in_array Vergleich unterschiedlich auf verschiedenen Maschinenwerk
- 22. Std :: chrono create konstante Zeit Runden
- 23. R Zuweisung Funktionsaufruf zu zwei verschiedenen Kernen
- 24. Std :: Chrono verschiedene Ergebnisse - feste Zeit Schrittschleife
- 25. Warum ist Std :: Chrono :: Dauer basierend auf Sekunden
- 26. Node.js child_process.fork(), um auf verschiedenen CPU-Kernen zu laufen
- 27. Warum ist der Standardwert von ServicePointManager.SecurityProtocol auf verschiedenen Computern unterschiedlich?
- 28. Wie unterschiedlich müssen Zufallssamen sein?
- 29. Auflösung von std :: Chrono :: high_resolution_clock entspricht nicht Messungen
- 30. Ausgabe von Datum und Uhrzeit in C++ mit std :: chrono
Welche Compiler zu benutzen? Leider sind Genauigkeit, Genauigkeit und Granularität nicht einheitlich (Compiler, seine Version und CPU beeinflussen sie stark). Wie Sie sich vorstellen können Hardware-Unterstützung variiert dann Standard kann nicht mit seinen Angaben hier zu genau sein –
Ich kompiliere mit GCC und Clang mit C++ 14.Ich ziele auf "moderne" Intel-CPUs – max