Latenz der CPU-Anweisungen auf x86- und x64-Prozessoren

24387
ST3

Ich bin auf der Suche nach einer Tabelle oder etwas Ähnlichem, das mir helfen könnte, die Effizienz des Montagecodes zu berechnen.

Wie ich weiß, dauert das Bit-Shiften 1 CPU-Takt, aber ich schaue wirklich nach, wie viel die Addition (die Subtraktion sollte das gleiche dauern), die Multiplikation und wie man vermutlich die Teilungszeit berechnet, wenn ich Werte kenne, die sich teilen.

Ich brauche wirklich Informationen zu ganzzahligen Werten, aber auch Ausführungszeiten von Float-Dateien sind willkommen.

10
Mögliches Gleiches auf SO: http://stackoverflow.com/questions/692718/how-to-find-cpu-cycle-for-anmontage-instruktion Ciro Santilli 新疆改造中心 六四事件 法轮功 vor 9 Jahren 0

3 Antworten auf die Frage

9
Jon Brauer

Im Allgemeinen benötigt jede dieser Operationen einen einzelnen Taktzyklus, um ausgeführt zu werden, wenn sich die Argumente in Registern in den verschiedenen Stufen der Pipeline befinden.

Was meinst du mit Latenz? Wie viele Zyklen verbringt eine Operation in der ALU?

Diese Tabelle könnte nützlich sein: http://www.agner.org/optimize/instruction_tables.pdf

Da moderne Prozessoren Superskalar sind und nicht in der richtigen Reihenfolge ausgeführt werden können, erhalten Sie oft eine Gesamtzahl von Anweisungen, die den Wert 1 überschreiten. Die Argumente für den Makrobefehl sind die wichtigsten, aber die Operation ist auch wichtig, da Divisionen länger dauern als XOR (<1) Zykluslatenz).

Viele x86-Anweisungen können mehrere Zyklen benötigen, um einige Phasen zu beenden, wenn sie komplex sind (beispielsweise REP-Befehle oder schlimmeres MWAIT).

Die Multiplikation ganzzahliger Prozessoren beträgt bei allen x86-CPUs (und bei einigen älteren CPUs) mindestens 3c-Latenz. Bei vielen CPUs ist die Pipeline vollständig, dh der Durchsatz beträgt 1 pro Takt. Dies ist jedoch nur möglich, wenn Sie drei unabhängige Multiplikationen im Flug haben. (Die FP-Multiplikation bei Haswell hat eine Latenz von 5 c und einen Durchsatz von 0,5 c. Sie benötigen also 10 Fluge, um den Durchsatz zu sättigen). Division ("div" und "idiv") ist noch schlimmer: Es ist mikrocodiert und * viel * höhere Latenz als "add" oder "shr", und es ist noch nicht einmal eine vollständige Pipeline auf einer CPU vorhanden. All dies ist direkt aus den Anweisungstabellen von Agner Fog. Es ist also gut, dass Sie das verlinkt haben. Peter Cordes vor 6 Jahren 2
Siehe auch [Warum ist dieser C ++ - Code schneller als meine handgeschriebene Assembly zum Testen der Collatz-Vermutung?] (Https://stackoverflow.com/questions/40354978/why-is-this-c-code-faster-than-my -handgeschriebene-Assembly-for-testing-the-collat ​​/ 40355466 (40355466) für weitere Informationen zur Optimierung von asm. Peter Cordes vor 6 Jahren 0
7
Brian Knoblauch

Die Berechnung der Effizienz des Montagecodes ist in diesen Tagen der Out-of-Order-Execution-Superskalare-Pipelines nicht der beste Weg. Es variiert je nach Prozessortyp. Die Anweisungen davor und danach variieren (Sie können zusätzlichen Code hinzufügen und ihn manchmal schneller laufen lassen!). Einige Operationen (insbesondere die Division) können sogar auf älteren, vorhersehbaren Chips eine Reihe von Ausführungszeiten aufweisen. Das Timing vieler Iterationen ist eigentlich der einzige Weg.

Ich weiß das, aber ich brauche das nicht in einem echten Projekt, sondern in einer Art ein _fun_-Programmierprojekt. ST3 vor 10 Jahren 0
Ob Sie es wirklich oder zum Spaß brauchen, ändert nichts an der Antwort für diese Prozessorlinie. Haben Sie überlegt, stattdessen zu einem deterministischeren Prozessor zu wechseln, beispielsweise zu einem Propeller-Chip? Brian Knoblauch vor 10 Jahren 0
Selbst mit einem Skalar können In-Order-Implementierungsverzweigungsfehlvorhersagen und Cache-Fehltreffer zu Laufzeitschwankungen führen. Paul A. Clayton vor 10 Jahren 3
Für rein CPU-gebundenes Zeug (kein Cache-Misses, keine Verzweigungsfehler) wird das CPU-Verhalten so detailliert verstanden, dass die statische Analyse oft genau vorhersagen kann, wie viele Zyklen pro Iteration eine Schleife für eine bestimmte CPU (z. B. Intel Haswell) beansprucht. Siehe [diese SO-Antwort] (https://stackoverflow.com/questions/28875325/gcc-optimization-flag-o3-makes-code-slower-then-o2), wo ich den Compiler-generierten ASM-Befehl erklären lasse Die verzweigte Version lief fast genau 1,5-mal schneller als die CMOV-Version der Sandybridge-CPU des OPs, aber viel näher an meinem Skylake. Peter Cordes vor 6 Jahren 0
Wenn Sie aus Performance-Gründen von Hand schreiben, ist es tatsächlich hilfreich, nach Latenz- und Durchsatzengpässen bei Intel- und AMD-CPUs zu suchen. Es ist jedoch schwierig und manchmal ist das, was für AMD optimal ist, nicht das, was für Intel optimal ist. Peter Cordes vor 6 Jahren 0
3
UmNyobe

Informationen zu Intel CPU finden Sie in den Handbüchern zu Intel Software-Entwicklern . Zum Beispiel beträgt die Latenzzeit 1 Zyklus für eine ganzzahlige Addition und 3 Zyklen für eine Ganzzahlmultiplikation.

Ich weiß nicht über die Multiplikation, aber ich erwarte, dass die Addition immer einen Zyklus dauert.

Ein Zyklus, es sei denn, es ist "frei" (parallel, wenn die Pipelines richtig angeordnet sind) oder dauert aufgrund eines Cache-Fehlschlags länger. :-) Brian Knoblauch vor 10 Jahren 0
Derzeit (2018) sind diese Informationen in Anhang C mit dem Titel "Instruction Latency and Throughput" des Dokuments 248966 "Intel® 64- und IA-32-Architekturen - Referenzhandbuch" verfügbar, das auch auf der in der Antwort verlinkten Seite verfügbar ist stefanct vor 6 Jahren 0