Ich suche nach einer Tabelle oder ähnlichem, die mir helfen könnte, die Effizienz des Assembler-Codes zu berechnen.
Wie ich weiß, benötigt die Bitverschiebung 1 CPU-Takt, aber ich schaue wirklich, wie viel Addition (Subtraktion sollte gleich sein), Multiplikation und wie man vermutlich die Teilungszeit berechnet, wenn ich Werte kenne, die sich teilen.
Ich brauche wirklich Informationen über ganzzahlige Werte, aber Float-Ausführungszeiten sind auch willkommen.
Antworten:
Im Allgemeinen benötigt jede dieser Operationen auch einen einzelnen Taktzyklus, um ausgeführt zu werden, wenn sich die Argumente in Registern in den verschiedenen Phasen der Pipeline befinden.
Was meinst du mit Latenz? Wie viele Zyklen verbringt eine Operation in der ALU?
Diese Tabelle ist möglicherweise hilfreich: 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 häufig Gesamtbefehle pro Zyklus, die 1 überschreiten. Die Argumente für den Makrobefehl sind am wichtigsten, aber die Operation ist auch wichtig, da Teilungen länger dauern als XOR (<1) Zykluslatenz).
Viele x86-Anweisungen können mehrere Zyklen benötigen, um einige Phasen abzuschließen, wenn sie komplex sind (z. B. REP-Befehle oder schlechteres MWAIT).
quelle
div
undidiv
) ist noch schlimmer: Es ist mikrocodiert und hat eine viel höhere Latenz alsadd
odershr
und ist auf keiner CPU vollständig Pipeline-fähig. All dies stammt direkt aus den Anweisungstabellen von Agner Fog. Es ist also gut, dass Sie das verlinkt haben.Die Berechnung der Effizienz von Baugruppencode ist in diesen Tagen von Super Scalar-Pipelines mit nicht ordnungsgemäßer Ausführung nicht der beste Weg. Dies hängt vom Prozessortyp ab. Die Anweisungen variieren sowohl vorher als auch nachher (Sie können zusätzlichen Code hinzufügen und ihn manchmal schneller ausführen lassen!). Einige Operationen (insbesondere Division) können eine Reihe von Ausführungszeiten haben, selbst auf älteren, besser vorhersehbaren Chips. Tatsächlich ist das Timing vieler Iterationen der einzige Weg.
quelle
Informationen zu Intel CPU finden Sie in den Handbüchern für Intel Software-Entwickler . Beispielsweise beträgt die Latenz 1 Zyklus für eine Ganzzahladdition und 3 Zyklen für eine Ganzzahlmultiplikation.
Ich weiß nichts über Multiplikation, aber ich erwarte, dass die Addition immer einen Zyklus dauert.
quelle