Pipeline-Abhängigkeiten, Konflikte
Abhängigkeiten
相關是指兩條指令之間存在某種依賴關係。如果兩條指令相關, 那麼它們就可能不能在流水線中重疊執行或者只能部分重疊。
分類:
- 數據相關(也稱 真數據相關)
- 名相關
- 控制相關
1.echte Datenabhängigkeit (true dependence)
Zwischen zwei aufeinander folgenden Befehle Inst1 und Inst2 besteht eine **==echte Datenabhängigkeit
(true dependence)==** von Inst1 zu Inst2, wenn Inst1 seine Ausgabe in ein Register Reg (oder in den Speicher) schreibt, ==das von Inst2 als Eingabe gelesen wird.==
數據相關
兩條指令
i
和j
, 如果下述條件之一成立,則稱指令j
,i
數據相關:
j
使用i
產生的結果j
與k
數據相關, 而k
又與i
數據相關(==transitiv==)
2. Name Dependency“ Namensabhängigkeiten(名相關)
這裏的名是指==指令所訪問的寄存器或者存儲器單元的名稱==。如果兩條指令使用了相同的名,但是他們之間並沒有數據流動, 則稱這兩條指令存在名相關。
(1) Gegenabhängigkeit (antidependence)
Zwischen zwei aufeinander folgenden Befehle Inst1 und Inst2 besteht eine ==Gegenabhängigkeit (antidependence)== von Inst1 zu Inst2, falls Inst1 Daten von einem Register Reg (oder einer Speicherstelle) liest, das ==anschließend von Inst2 überschrieben== wird.
反相關
如果
j
指令所寫的名與i
所讀的名相同, 則稱i
與j
發生了反相關。==反相關指令之間的執行順序是必須嚴格遵守的,以保證
i
所讀的值是正確的。==
(2) Ausgabeabhängigkeit (output dependence)
Zwischen zwei aufeinander folgenden Befehle Inst1 und Inst2 besteht eine ==Ausgabeabhängigkeit (output dependence)== von Inst2 zu Inst1, wenn beide in das gleiche Register Reg (oder eine Speicherstelle) schreiben und Inst2 sein Ergebnis ==nach== Inst1 schreibt.
如果指令
j
和指令i
所寫的名相同, 則稱i
和j
發生了輸出相關。==輸出相關指令的執行順序是不能顛倒的,以保證最後的結果是指令j
寫進去的。==
與真數據相關不同, 名相關的兩條指令之間並沒有數據的傳送,只是使用了相同的名而已。
–> ==可以通過改變指令中操作數的名來相處名相關(換名技術)==。 對於寄存器操作數進行換名稱爲==寄存器換名==。
3. 控制相關
是指由分支指令引起的相關。需要根據分支指令的執行結果來確定後面該執行哪個分支上的指令。
==當流水線遇到分支指令和其它能夠改變 PC 值的指令時,就會發生控制相關==
一般來說,==爲了保證程序應有的執行順序 必須嚴格按照控制相關確定的順序執行==。
Pipeline konflikte
Datenkonflikte (數據衝突)
Struktur- / Ressourcekonflikte (結構衝突)
- Steuerflusskonflikt (控制衝突)
1.==Datenkonflikte==
Treten auf, wenn ein benötigter Operand in der Pipeline (noch) nicht verfügbar ist.
當相關的指令彼此靠的足夠近時, 它們在流水線中的重疊執行或者重新排序會改變指令讀取操作數的順序,使之不同於它們串行執行時的順序 –> ==發生數據衝突==
(1) Lese-nach-Schreibe-Konflikt (read after write, RAW)
- Wird durch **==echte Abhängigkeit==** verursacht.
指令j使用的指令i的計算結果, 而且在i將結果寫入寄存器之前就去讀該寄存器, 因而得到的時舊值。
(2) Schreibe-nach-Lese-Konflikt (write after read, WAR)
Wird durch **==Gegenabhängigkeit==** verursacht. Tritt dann auf, wenn in einer Pipeline **==die Schreibestufe der Lesestufe vorangeht==**.指令j的目的寄存器和指令i的源操作數寄存器相同,而且j在i讀取該寄存器之前就對它進行了寫操作,導致i讀到的時錯誤的值。
in der fünfstufigen DLX-Pipeline ==nicht== auftreten
(3) Schreibe-nach-Schreibe-Konflikt (write after write, WAW)
- Wird durch ==Ausgabeabhängigkeit== verursacht.
- Tritt in Pipelines auf, die mehr als in einer Stufe schreiben, oder es erlauben, dass die Ausführung eines Befehls fortgesetzt werden darf, wenn ein vorhergehender Befehl angehalten worden ist.
指令j和指令i的結果寄存器相同,而且j在i寫入之前就先對該寄存器進行了寫入操作,從而導致寫入順序錯誤。最後在結果寄存器中留下的時i寫入的值(本來應該是j寫入的值)
in der fünfstufigen DLX-Pipeline ==nicht== auftreten
Lösungen für Datenkonflikte
1. Software-Lösungen
Aufgabe des Compilers:
==Erkennen== von Datenkonflikten
==Einfügen von Leeroperationen (noop) nach jedem Befehl==, der einen Konflikt verursacht oder verursachen kann.
��Statische Befehlsanordnung:
==Instruction Scheduling, Pipeline Scheduling==
爲了減少停頓,對於無法用定向技術解決的數據衝突,可以通過在==編譯時讓編譯器重新組織指令順序來消除衝突==,這種技術成爲“指令調度”或者“流水線調度”。
Umordnen der Befehle des Programms (==Code-Optimierung==), um Leeroperationen zu eliminieren.
2.Hardware-Lösungen
==Leerlauf der Pipeline(Pipeline-Sperrung (interlocking),Pipeline-Leerlauf (stalling))==:
Die einfachste Art, mit solchen Datenkonflikten umzugehen ist es, Inst2 in der Pipeline für ==zwei Takte anzuhalten==. Auch als Pipeline-Sperrung (interlocking) oder Pipeline-Leerlauf (stalling) bezeichnet.
爲了保證代碼能在流水線中正確執行,需要設置一個稱爲“流水線互鎖機制”的功能部件, 作用是檢測和發現數據衝突,並使流水線停頓,直至衝突消失。停頓是從等待相關數據的指令開始,到相應的指令產生數據爲止。停頓導致在流水線中插入氣泡(Bubble), 使得被停頓的CPI增加了相應的時鐘週期數。
==Forwarding==:
Wenn ein Datenkonflikt erkannt wird, so sorgt eine Hardware-Schaltung dafür, dass der betreffende Operand nicht aus dem Universalregister, ==sondern direkt aus dem ALU- Ausgaberegister der vorherigen Operation in das ALU- Eingaberegister übertragen wird.==
使用定向技術減少數據衝突引起的停頓:
將計算結果從其產生的地方(ALU的出口、存儲器(對於load
的指令))直接送到其他指令需要它的地方(ALU的入口),便可以避免停頓。==Forwarding with interlocking==
2. Struktur- / Ressourcenkonflikte
在流水線處理機中, 如果某種指令組合因爲資源衝突而不能正常執行,則稱該處理機有結構衝突。這種情況發生在功能部件不是完全流水或者資源份數不夠時。
Tretenauf,wenn zwei oder mehr Befehle gleichzeitig dieselbe Ressource benötigen, auf die aber nur einmal zugegriffen werden kann
Treten bei einer einfachen Pipeline,wieder DLX-Pipeline, nicht auf.
Ziel beim Pipeline-Entwurf:Ressourcenkonflikte möglichst zu vermeiden und dort, wo sie nicht vermeidbar sind, zu erkennen und behandeln.
Lösungen von Ressourcenkonflikte
Arbitrierung mit Interlocking
Arbitrierungslogik hält den Befehl an, der den Konflikt verursacht �� Verzögerung durch Leerzyklen
Übertaktung
Die Ressource, die den Konflikt hervorruft schneller als die übrigen Pipeline-Stufen takten
Ressourcenreplizierung: Vervielfachung der Ressourcen
Beispiel: Registersatz mit mehreren Schreibkanälen
Steuerkonflikte
Steuerflussabhängigkeiten verursachen Steuerflusskonflikte in der DLX-Pipeline
da :
- der Programmsteuerbefehl erst in der ID-Stufe als solcher erkannt und damit bereits ein Befehl des falschen Programmpfades in die Pipeline geladen wurde.
- die Sprungzieladresse von der ALU erst in der EX-Stufe berechnet wird und
- der PC am Ende der MEM-Stufe ersetzt wird
In der Pipeline befinden sich drei Befehle, die bereits geladen worden sind und wieder gelöscht (annulliert) werden müssen, wenn der Sprung ausgeführt wird.
Bei einer Verzweigung kann erst nach drei Taktzyklen mit der Ausführung der korrekten Befehlsfolge gestartet werden.
一條分支指令,從IF到在MEM改變PC值,中間隔了3個Takte,所以在這三個Takte期間會由3條指令被load進來。
處理分支最簡單的方法是==“凍結”或者“排空流水線”==: 一旦在ID段檢測到分支指令,就暫停氣候的所有指令的執行,知道分支指令到達MEM階段,確定出分支是否成功並計算出新的PC值爲止。然後按照新的PC值取指令。在這種情況下,需要加入3個Takte的delay slot,帶來了3個時鐘週期的延遲。 –> 這種讓流水線空等的辦法不是一種好的選擇。 Um die Anzahl der Wartezyklen zu verringern:
Sprungrichtung so schnell wie möglich entscheiden und Zieladresse so schnell wie möglich berechnen.
Lösung
1. Software-Lösung
Verzögerte Sprungtechnik (delayed branch technique)
- Ausfüllen der Verzögerungszeitschlitze (delay slots) mit Leerbefehlen (noop)
- DLX-Pipeline:DreiLeerbefehlenachjedemProgrammsteuerbefehl
Statische Befehlsanordnung
- Der Compiler verschiebt Befehle, die in der logischen Programmreihenfolge vor dem Sprungbefehl liegen, in die Verzögerungszeitschlitze
延遲分支
主要思想是從邏輯上“延遲”分支指令的執行時間。把延遲分支看做是由原來的分支指令和若干個延遲槽構成。不管分支是否成功,都要按順序執行延遲槽中的指令(實際當中絕大多數的延遲槽都是一個)。
即:分支指令 延遲槽
可以看出,只要分支延遲槽中的指令是有用的,流水線中就沒有出現停頓,這時延遲分支的方法能很好的減少分支延遲。
放入延遲槽中的指令是由編譯器來選擇的。實際上延遲分支能否帶來好處完全取決於編譯器能否把有用的指令調度到延遲槽中。(這也是一種指令調度技術,常用的調度方法有:從前調度、從目標處調度、從失敗處調度)。
2. Hardware-Lösung
預測分支失敗
沿失敗的分支繼續處理指令,就好像什麼都沒發生似得。當確定分支是失敗的時候,說明預測正確,流水線正確流動。當確定分支是成功時, 流水線就把在分支指令後取出的指令轉化爲空操作,並按分支目標地址重新取指令執行。
採用這這方法處理分支指令的後續指令時,要保證分支結果出來之前不能改變處理機的狀態,以便一代猜錯時,處理機能夠退到原先的狀態。預測分支成功
按分支成功的假設進行處理。當流水線ID段檢測到分支指令後,一旦計算出了分支目標地址,就開始從該目標地址取指令執行。