Ich mache einige Linux-Kernel-Timings, insbesondere im Interrupt-Handling-Pfad. Ich habe RDTSC für Timings verwendet, aber ich habe kürzlich erfahren, dass es nicht unbedingt genau ist, da die Anweisungen möglicherweise nicht in der richtigen Reihenfolge ausgeführt werden.
Ich habe dann versucht:
-
RDTSC + CPUID (hier in umgekehrter Reihenfolge), um die Pipeline zu leeren, und bis zu 60x Overhead (!) auf einer virtuellen Maschine (meiner Arbeitsumgebung) aufgrund von Hypercalls und so weiter. Dies gilt sowohl mit als auch ohne aktivierte HW-Virtualisierung.
-
Vor kurzem bin ich auf die Anweisung RDTSCP * gestoßen, die anscheinend das tut, was RDTSC + CPUID getan hat, aber effizienter, da es sich um eine neuere Anweisung handelt – nur ein relativer Overhead von 1,5x-2x.
Meine Frage ist RDTSCP wirklich genau als Messpunkt, und ist es die “richtige” Art, das Timing durchzuführen?
Um es klarer zu sagen, mein Timing ist intern im Wesentlichen so:
- Speichern Sie den aktuellen Wert des Zykluszählers
- Führen Sie eine Art von Benchmark durch (z. B. Festplatte, Netzwerk)
- Addieren Sie das Delta des aktuellen und des vorherigen Zykluszählers zu einem Akkumulatorwert und inkrementieren Sie einen Zähler pro einzelnem Interrupt
- Teilen Sie am Ende das Delta/den Akkumulator durch die Anzahl der Interrupts, um die durchschnittlichen Zykluskosten pro Interrupt zu erhalten.
Nicht
CPUID
Implementieren Sie eine Art vollständige Speicherbarriere? Das wäre spürbar teuer.– Kerrek SB
29. Dezember 2014 um 17:29 Uhr
@KerrekSB Ich denke, der Overhead kommt von den Hypercalls, einfach weil es fast keinen Overhead von CPUID gibt, wenn ich denselben Test in einer nicht virtualisierten Umgebung durchführe.
– Ricky Mutschlechner
29. Dezember 2014 um 17:30 Uhr
Ist es richtig? Nun, laut Whitepaper ist es nicht perfekt, aber es ist das Beste, was Sie haben. Beachten Sie, dass Out-of-Order-Effekte möglicherweise vernachlässigbar sind, wenn Ihr gemessener Abschnitt lang genug ist.
– Leeor
29. Dezember 2014 um 20:18 Uhr
CPUID löst bedingungslos einen VMExit aus, der bei der Virtualisierung einige tausend Zykluskosten verursachen sollte.
– Ruthafjord
28. Mai 2019 um 22:12 Uhr