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.Die Befehlspipeline von Intel Core 2 Duo leeren?
Momentan verwende ich eine RDTSC-Anweisung vor und nach jeder Operation, um die Zyklusanzahl 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 jemand 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.
Sie haben Recht mit den Fence-Anweisungen. CPUID bedeutet sie tatsächlich (ich habe meine Antwort gelöscht). Beachten Sie, dass während der CPUID-Serialisierung die Caches nicht gelöscht werden, was sich ebenfalls auf die Leistung auswirken kann. Der Cache kann mit WBINVD gelöscht werden. Vielleicht möchten Sie das zu Ihrer Antwort hinzufügen. –
wbinvd ist privilegiert ... Sie könnten jedoch clflush verwenden. Es gibt eine separate Frage über diese Art von Dingen aus der letzten Woche .... http://stackoverflow.com/questions/558848/can-i-force-cache-cohenerency-on-a-multicore-x86-cpu/558900# 558900 – SoapBox
Große Antwort. Vielen Dank. –