2 Stimmen

EMMS-Befehlsausführungszeit?

Ich lese gerade Die Kunst der Montage: Der MMX-Befehlssatz" Nach der Ausführung einiger MMX-Befehle wird der EMMS Befehl ausgeführt werden, um die FPU zurückzusetzen. Er besagt, dass der EMMS-Befehl recht langsam ist.

Als ich jedoch ein Profil der EMMS Ausführungszeit, um zu sehen, wie langsam sie war (mit RDTSC um die Taktzyklen zu zählen), scheint sie in 0 Zyklen ausgeführt zu werden.

Was ist denn hier los? Habe ich irgendwo einen Fehler gemacht oder ist Art Of Assembly nicht mehr aktuell?

2voto

stormsoul Punkte 466

Auf dem alten Pentium MMX war er langsam, aber auf moderneren Prozessoren ist er sehr schnell.

Dennoch ist MMX heute größtenteils überflüssig. Verwenden Sie SSE2, und Sie werden keine Probleme beim Multiplexen mit der FPU haben.

Außerdem kann der RDTSC-Befehl parallel zu anderen Befehlen ausgeführt werden, was Ihre Messung erklärt - die CPU hat einfach begonnen, beide RDTSCs und den EMMS gleichzeitig im selben Taktzyklus auszuführen... Wenn Sie die Zeit messen wollen, die ein Stück Code benötigt, müssen Sie beide RDTSCs in Bezug auf den Code serialisieren - normalerweise wird dafür die CPUID-Anweisung verwendet. Da die von Ihnen verwendeten Serialisierungsanweisungen selbst CPU-Zyklen benötigen, müssen Sie auch messen, wie viele Zyklen es ohne Code zwischen dem von Ihnen geschriebenen Messgerät dauert.

Der letzte Punkt ist, dass sogar auf dem Pentium MMX der EMMS-Befehl selbst schnell fertig wurde - es war der erste FPU-Befehl danach, der eine böse Verzögerung bekam...

0 Stimmen

emms ist auf Intel-CPUs von ~2009 kaum "sehr schnell". Auf Core2 und Nehalem sind es 11 uops, und der Durchsatz liegt bei einem pro 6 Zyklen ( agner.org/optimieren ). Es lohnt sich nur, MMX zu verwenden, wenn man eine Schleife hat, nicht für ein paar Anweisungen für 64-Bit-Integer-Mathematik im 32-Bit-Modus oder eine 64-Bit-Kopie, wenn man sie nicht in eine größere Funktion einfügen kann. Auf neueren CPUs (wo MMX mehr und mehr obsolet wird) ist EMMS sogar noch langsamer, z.B. 31 uops / 18 Zyklen auf Sandybridge.

0 Stimmen

Und wenn Sie SSE2 haben, brauchen Sie x87 überhaupt nicht (es sei denn, Sie brauchen tatsächlich 80-Bit-Präzision oder eine 32-Bit-Aufrufkonvention erzwingt dies).

0 Stimmen

EMMS auf dem P5MMX benötigt nur einen Takt; die tatsächliche Strafe für den ersten x87-Befehl beträgt ~58 Takte, laut Agner Fogs Befehlstabellen. Daher ist es auf dieser CPU tatsächlich billig, EMMS nur am Ende einer Reihe von Funktionen zu haben, wenn keine x87-Anweisungen ausgeführt werden.

0voto

zvrba Punkte 23708

Sie benötigen eine serialisierende Anweisung, wie z. B. CPUID, um sicherzustellen, dass RDTSC nicht außer der Reihe ausgeführt wird. Sie können mehr lesen aquí .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X