2017-06-05 1 views
8

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

+0

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 –

+0

Ich kompiliere mit GCC und Clang mit C++ 14.Ich ziele auf "moderne" Intel-CPUs – max

Antwort

3

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, ...); 
4

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.

Verwandte Themen