Die Befehlspipeline von Intel Core 2 Duo leeren?

8

Ich schreibe einige Mikro-Benchmark-Code für einige sehr kurze Operationen in C. Zum Beispiel, eine Sache, die ich messe ist, wie viele Zyklen benötigt werden, um eine leere Funktion abhängig von der Anzahl der Argumente zu nennen.

Momentan verwende ich eine RDTSC-Anweisung vor und nach jeder Operation, um die Zykluszahl der CPU zu ermitteln. Ich bin jedoch besorgt, dass Anweisungen, die vor dem ersten RDTSC ausgegeben wurden, die tatsächlichen Anweisungen, die ich gerade vermesse, verlangsamen. Ich bin auch besorgt, dass die vollständige Operation möglicherweise nicht abgeschlossen ist, bevor das zweite RDTSC ausgegeben wird.

Kennt irgendjemand eine x86-Anweisung, die alle In-Flight-Befehle zum Commit zwingt, bevor neue Befehle ausgegeben werden? Mir wurde gesagt, CPUID könnte dies tun, aber ich konnte keine Dokumentation finden, die das sagt.

    
Jay Conrod 22.02.2009, 17:52
quelle

1 Antwort

9

Nach meinem Wissen gibt es keine Anweisung, die die Pipeline spezifisch "entwässert". Dies kann leicht erreicht werden, obwohl eine Serialisierungsanweisung verwendet wird.

CPUID ist eine Serialisierungsanweisung, die genau das bedeutet, wonach Sie suchen. Jeder Befehl tritt auf, bevor er vor dem CPUID-Befehl ausgeführt wird.

Das Folgende sollte also den gewünschten Effekt haben:

%Vor%

Aber abgesehen davon empfehle ich Ihnen nicht, dies zu tun. Ihre "Sachen" können immer noch von vielen anderen Dingen außerhalb Ihrer Kontrolle beeinflusst werden (wie CPU-Caches, anderen Prozessen, die auf dem System laufen, usw.), und Sie werden nie in der Lage sein, sie alle zu beseitigen. Der beste Weg, um genaue Leistungsstatistiken zu erhalten, besteht darin, die Operation (en), die Sie mindestens mehrere Millionen Mal messen möchten, durchzuführen und die Ausführungszeit des Stapels zu mitteln.

Bearbeiten: Die meisten Befehlsreferenzen für CPUID erwähnen ihre Serialisierungseigenschaften, z. B. NASM Handbuch Anhang B .

Bearbeiten 2 : Sehen Sie sich auch diese verwandte Frage .

    
SoapBox 22.02.2009, 18:05
quelle