流水线

流水线中的依赖包括真数据依赖、名相关和控制相关,其中名相关可通过换名技术解决。数据冲突如RAW、WAR和WAW可能导致流水线停顿,解决方法包括软件的指令调度和硬件的流水线互锁、前向传递。结构冲突和控制冲突也需要通过资源管理和快速决策来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.==

数据相关

两条指令 ij, 如果下述条件之一成立,则称指令 j, i 数据相关:

  1. j 使用 i 产生的结果
  2. jk 数据相关, 而 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 所读的名相同, 则称 ij 发生了反相关。

==反相关指令之间的执行顺序是必须严格遵守的,以保证 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所写的名相同, 则称ij发生了输出相关。==输出相关指令的执行顺序是不能颠倒的,以保证最后的结果指令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段检测到分支指令后,一旦计算出了分支目标地址,就开始从该目标地址取指令执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值