21. 控制冒险的处理

1. 转移指令对流水线的影响

如下图所示,T1周期取指add指令,T2周期取指sub指令,T3周期取指beq指令。

转移指令对流水线的影响

对于人类来说,我们能看到sub和beq之间可能存在一个循环,但是计算机不知道,它只会在继续取指,T4周期取指lw指令,此时beq指令完成译码阶段但是还不知道要不要跳转。因此T5继续取指sw指令,T5结束时,beq完成执行阶段,此时知道了是否跳转。

如果beq条件满足,即s3 == s4,那么就要跳转到Next执行,lw指令和sw指令实际上就不应该被执行,如下图所示,

beq条件满足,lw指令和sw指令不应该执行

那么T6周期取指sub指令,T7周期取指beq指令,后面又和T4、T5一样了。总体看来就是处理器取回2条正确指令,接着取回2条错误指令(假设beq条件满足),如此反复,流水线的50%性能被浪费了。这是因为转移指令本身和流水线的要求是相违背的。转移指令改变指令流向,破坏了流水模式。

2. 转移指令对性能的影响

如下图所示,转移指令在程序中的占比挺大,因此不能忍受其对流水线的破坏,必须解决,

转移指令对性能的影响

如下图所示,当前流行的处理器超标量数多、流水线级数深,转移指令如果不解决,对处理器的流水线影响太大!

目前流行的处理器结构

3. 转移开销

如下图所示,对于转移指令,必须解决两个问题,一个是转移判定条件,一个是生成目标地址。

转移开销

4. 转移指令的分类

从2个维度分为4类,如下图所示,直接转移指令是把目标地址直接写在指令编码中,而间接转移指令的目标地址放在一个寄存器中,指令需要先访问这个寄存器才可以知道目标地址,

转移指令的分类

5. 无条件转移指令

5.1 直接转移 j Target

如下图所示,因为是无条件转移指令,因此不需要判断是否转移。

无条件直接转移指令

指令编码中就有26-bit立即数,根据计算公式就可以计算出转移目标地址。

根据计算公式,可以看出目标地址只与当前PC寄存器的值和指令编码中的26-bit立即数有关。从数据通路上来看,如下图所示,

从数据通路上看无条件直接转移指令

指令存储器根据PC的值就可以取出指令,在这个取指阶段,加一些硬件电路就可以判断出这是一条无条件直接转移指令,然后PC update部件就是PC+4的值,将这个PC update部件的输出的高4位和指令中的26-bit立即数再和00拼起来,就是转移目标地址了。流水线不需要stall。

5.2 无条件间接转移指令 jr rs

如下图所示,无条件间接转移指令 jr rs,从寄存器堆中读取rs指定的寄存器的内容,将这个数据作为转移目标地址。

无条件间接转移指令

从处理器结构上,来看如何处理无条件间接转移指令,如下图所示,

从数据通路上看无条件间接转移指令

在取指阶段无法确定转移目标地址,因此流水线必须stall一个周期,在译码阶段,busA上的数据就是rs指定的寄存器的数据,利用这个数据就可以计算出转移目标地址。因此,对于无条件间接转移指令,流水线必须stall一个周期。

6. 条件转移指令

如下图所示,beq指令是条件直接转移指令,判断如果R[rs] == R[rt]后,目标转移地址的计算就如下图所示,否则不满足条件,PC的更新就是PC+4. 

条件直接转移指令

我们发现,不论条件是否满足,目标转移地址都只与当前PC寄存器的值和指令编码中的立即数有关,因此目标地址的计算不会stall流水线。

而条件的判断会影响流水线。如下图所示,在译码阶段完成时,rs和rt指定的寄存器的数据输出在busA上和busB上,但此时还无法判断两个寄存器的数据是否相等。在执行阶段完成时,ALU输出就可以判断两个寄存器是否相等了,因此流水线需要stall两个周期。

从处理器结构上看beq指令的执行

但其实,判断rs和rt指定的寄存器的数据是否相等很简单,对寄存器堆做一点改造就可以在译码阶段完成判断。如下图所示,这样,流水线只需要stall一个周期,beq指令对流水线的影响降低了,

在寄存器堆的输出加一个判断电路完成数据相等判断

7. 控制冒险的影响总结

综上,我们发现,

无条件直接转移指令 j Target 不会stall流水线

无条件间接转移指令 jr rs 会stall一个周期

条件直接转移指令 beq rs,rt,imm16 会stall一个周期

8. 进一步优化,不让转移指令影响流水线

8.1 延迟转移技术

如下图所示,xor指令,addi指令,subi指令后,跟着一条beq指令,beq指令stall流水线1个周期后,会判断转移还是不转移,这里流水线就空出了一个周期,我们可以在这个周期中插入一条指令而不影响流水线。

延迟转移技术举例

那么就向上去找,addi指令和subi指令都与beq指令依赖,但是xor指令与beq指令没有依赖,就可以调整指令顺序,将xor指令放在beq指令后面执行,那么流水线就不需要stall了。如下图所示,这样beq指令取指后进入译码阶段,xor指令就可以进入流水线取指,xor取指后,beq就完成了条件判断,知道是否转移了。这样,流水线就不需要stall了。

调整指令顺序
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 内容要点:流水线,相关和冒险 1. 流水线基本原理 执行指令的主要步骤(MIPS) 1. 取指(Fetch)从存储...
    Lynn_4f26阅读 2,019评论 0 1
  • 中央处理器 一、程序执行概述 1.程序及指令的执行过程 指令周期:CPU取出并执行一条执行的时间。 CPU为了能完...
    我可能是个假开发阅读 4,189评论 0 5
  • 流水线本质是提高了时间并行性,这样可能会带来一些错误。 1. 什么是冒险hazard 阻止下一条指令在下一个时钟周...
    yangh_阅读 2,174评论 0 0
  • 1. 什么是数据冒险 当前指令需要使用之前指令的运算结果,但是结果还没有写回。 2. 数据冒险举例 比如下图中,第...
    yangh_阅读 5,684评论 1 5
  • 阅读经典——《深入理解计算机系统》06 本文,我们要做一件大胆的事情,从零开始实现一个全新的指令集架构,以此深入理...
    金戈大王阅读 20,648评论 7 52