2016-05-05 9 views

Antwort

2

TL: DR: 5 insns pro Takt, wo einer von ihnen ein test oder cmp das kann ist macro-fuse mit einem jcc.


Quelle: Agner Fog's microarch pdf and instruction tables. Siehe auch das Tag-Wiki.

Die Out-of-Order-Pipeline in Intel Core2 und höher kann 4 Fused-Domain-Ups pro Takt ausgeben/umbenennen. Dies ist der Flaschenhals. Macro-Fusion kombiniert cmp/jcc zu einem einzigen UOP, aber dies kann nur einmal pro Dekodierblock passieren. (Bis Haswell).

Selbst wenn Sie die Dinge so arrangieren könnten, dass mehr als ein macro-fusioniertes Paar pro 4 UPs in einer Schleife ist, hat Nehalem einen Durchsatz von nur einem fusionierten Test-und-Zweig-UPOP pro Clock (Port 5). Es könnte also nicht mehr als einen macro-fusionierten Vergleich und Zweig pro Takt aufrechterhalten, selbst wenn einige von ihnen nicht genommen werden. (Haswell kann nicht genommene Verzweigungen an Port 0 oder Port 6 ausführen).

;; Should run at one iteration per clock. 
.l: 
    mov edx, [rsi] ; doesn't need an ALU uop. nop would work here, too 
    add eax, edx 
    inc rsi 
    cmp rsi, rdi 
    jb .l 

Zur Erleichterung der Prüfung und Cache/Speicher-Engpässe beseitigen, können Sie sie ändern von der gleichen Stelle jedes Mal zu laden, anstatt die Schleifenzähler im Adressierungsmodus zu verwenden.

Beachten Sie, dass Pre-Haswell Uarches nur drei ALU-Ports haben. mov Laden oder Speichern nehmen Pipelinebandbreite auf, so dass ein 4-wide Problem/Umbenennen von Vorteil ist. Es ist auch nützlich, dass das Front-End schneller als der Out-of-Order-Core ausgeführt werden kann. Es gibt also immer einen Arbeitspuffer, der in den Scheduler eingereiht wird, damit er die Parallelität auf Befehlsebene finden kann und fange früh mit den zukünftigen Lasten an und solche Sachen.

Ich denke, andere als Lade-/Speicher (push/pop dank der Stapelmaschine mit), nop und fxchg sind die einzigen verschmolzenen Domäne Uops, die eine ALU-Port in Nehalem nicht brauchen. Auf SnB-Familie Uarches, xor same,same is also handled in the rename/issue stage, und manchmal auch reg-reg mov s (IvB und später).

+0

Das ist eine ausgezeichnete Erklärung, danke! – user3842413