Wie sind verschiedene Anweisungstypen in AMD-Mikroprozessoren definiert, um DirectPath- und VectorPath-Flüsse zu identifizieren?

306
val

In der AMD 10h-Architektur wie Opteron werden die vorabgerufenen Anweisungen nach der Ausrichtung in zwei Flüsse aufgeteilt: DirectPath (oder Fastpath) und VectorPath (Microcode-Engine). Später sind diese Flüsse für Ganzzahl- oder Gleitkomma-Ausführungspfade bereit.

Auf welche Weise werden die abgerufenen Anweisungen für beide Flüsse markiert? Gibt es ein Flag-Bit oder eine Art?

Die AMD-Dokumentation ist bezüglich des Differenzierungsmechanismus sehr vage. Das einzige, was erwähnt wird, ist:

Wenn das Ziel-32-Byte- Befehlsfenster aus dem L1-Befehls-Cache abgerufen wird, werden die Befehlsbytes geprüft, um zu bestimmen, ob der Typ der Basisdecodierung DirectPath oder VectorPath ist.

3

1 Antwort auf die Frage

0
Peter Cordes

TL: DR: Die verschiedenen Pfade sind nicht wirklich unterschiedlich. Der größere Unterschied nach der Dekodierung liegt zwischen FP / SIMD und Integer, die in verschiedenen Schedulern enthalten sind, obwohl DirectPath-Anweisungen für beide vorhanden sind.

Siehe auch David Kanters Mikroarchitekturschreiben in Barcelona (AMD Fam10h) . Sein Diagramm des Frontends in K10 / K8 / Core2 ist äußerst relevant:

enter link description here

Weitere Links zu solchen Themen finden Sie im x86-Tag-Wiki zu SO


Aus dem Mikroarch-Führer von Agner Fog ( http://agner.org/optimize/ ), Kapitel K8 / K10:

17.3 Vordecodierung und Dekodierung der Befehlslänge

Eine Anweisung kann eine beliebige Länge von 1 bis 15 Byte haben. Die Befehlsgrenzen werden im Code-Cache markiert und in den Level-2-Cache kopiert. Die Befehlslängendecodierung ist daher selten ein Engpass, obwohl der Befehlslängendecodierer nur einen Befehl pro Taktzyklus verarbeiten kann .

Dies kann von der Erzeugung der anderen Informationen vor der Dekodierung getrennt sein, da Agner sagt, dass auch Informationen zur Anweisungslänge im L2-Cache gespeichert werden. Andere Informationen vor der Dekodierung müssen jedoch beim Abrufen von L2 in L1I neu generiert werden.

Der Level-1-Code-Cache enthält eine beträchtliche Menge an Vordecodierungsinformationen. Dazu gehören Informationen darüber, wo die einzelnen Anweisungen enden, wo sich das Opcode-Byte befindet, und es wird zwischen Einzel-, Doppel- und Vektorpfadbefehlen sowie der Erkennung von Sprüngen und Aufrufen unterschieden. Einige dieser Informationen werden in den Level-2-Cache kopiert, jedoch nicht alle. Die geringe Bandbreite für Anweisungen, die aus dem Level-2-Cache stammen, kann auf den Vorgang des Hinzufügens weiterer Vordecodierungsinformationen zurückzuführen sein.

Die tatsächlichen Details des Speicherformats für die zusätzlichen Daten sind nicht bekannt. Vermutlich hat jede Zeile des L1I-Caches einige zusätzliche Bytes in dem Datenarray, die über den 64B-Speicherinhalt hinausgehen, in einem benutzerdefinierten Format. Es scheint, als würde dies viel zusätzlichen Platz benötigen, um den Eckfall zu behandeln, bei dem jeder Befehl ein einzelnes Byte war.


Diese getrennten Ströme sind nicht wirklich alle, die zu trennen. Es gibt drei Decoder, und sie können entweder bis zu 3 DirectPath-Anweisungen decodieren (wodurch bis zu drei Makro-Ops erzeugt werden) oder eine VectorPath-Anweisung kann decodiert werden.

Agner Fog sagt:

Vektorpfadanweisungen sind weniger effizient als Einzel- oder Doppelanweisungen, da sie exklusiven Zugriff auf die Decoder und Pipelines erfordern und nicht immer optimal neu angeordnet werden. Zum Beispiel:

; Example 17.1. AMD instruction breakdown xchg eax, ebx ; Vector path, 3 ops nop ; Direct path, 1 op xchg ecx, edx ; Vector path, 3 ops nop ; Direct path, 1 op 

Diese Sequenz dauert 4 Taktzyklen zum Dekodieren, da die Vektorpfadbefehle alleine dekodieren müssen.

(Dieses Beispiel ist für K8. K10 wird xchg r,rals 2-m-Op-Anweisung ausgeführt. Agner sagt, dass nur K8 DirectPath-Double-Anweisungen hat (und K10 nur Einzel-vs.-Vektor), aber das stimmt nicht mit dem Diagramm von David Kanter überein zeigt einen Pack-Puffer mit einem Durchsatz von 3 m-ops (aka uops) pro Takt, aber die einspeisenden Decoder können pro Zyklus 1 oder 2 uops erzeugen.

Die Bulldozer-Familie verfügt auch über Doppelanweisungen, und ihre Decoder können bis zu 4 M-Ops pro Taktgeber produzieren. So kann ein einzelner Vectorpath-Befehl oder 1-1-1-1 (vier Directpath-Einzelbefehle) oder 2-1-1 dekodiert werden. Dies bedeutet, dass nur der erste Decoder Double-Anweisungen verarbeiten kann. Piledriver und später können auch 2-2-Muster (zwei aufeinanderfolgende DirectPath-Double-Anweisungen) decodieren.

Ryzen hat einen uop-Cache für dekodierte Anweisungen. Es können bis zu 5 DirectPath Single-Anweisungen pro Takt in den nicht in Ordnung befindlichen Kern ausgegeben werden. Wenn es sich bei den Anweisungen jedoch um doppelte Anweisungen handelt, können 6 Uops pro Takt ausgeführt werden. (AVX / AVX2 kann sich also auf Ryzen lohnen, obwohl es 256b-Anweisungen als zwei Uops ausführt.)


Die Strategie von Intel ist ganz anders :

Sie dekodieren die Länge, speichern sie jedoch nirgendwo auf lange Sicht. Die Decoder versuchen zu decodieren, und wenn ein Befehl nicht in einem einfachen Decoder funktioniert, handelt es sich um einen Multi-Uop-Befehl, der auf den nächsten Taktzyklus warten muss, damit der komplexe Decoder damit umgehen kann.

Der komplexe Decoder kann Befehle bis zu 4 Uops direkt verarbeiten, ansonsten müssen die Uops vom Mikrocode stammen.