CPU设计-分支预测

目录

CPU分支指令类型分类

1 )无条件跳转/分支( Unconditional Jump/Branch )指令

无条件直接跳转/分支:

无条件间接跳转/分支:

2 )带条件跳转/分支( Condinal Jump/Branch )指令

带条件直接跳转/分支:

带条件间接跳转/分支:

分支预测:

一、预测方向。可以分为静态预测和动态预测两种

1)静态预测

2)动态预测

一级预测器

两级预测器

二、预测地址

1) BTB

2) RAS

3) Indirect BTB


CPU分支指令类型分类

1 )无条件跳转/分支( Unconditional Jump/Branch )指令

无需条件一定会发生跳转的指令,根据跳转目标地址计算方式不同可分为两类

无条件直接跳转/分支

即跳转的目标地址从指令编码中的立即数可以直接计算而得。

无条件间接跳转/分支:

即跳转目标地址需要寄存器索引的操作数中计算得到

2 )带条件跳转/分支( Condinal Jump/Branch )指令

根据判断条件而决定是否发生跳转的指令,根据跳转目标地址计算方式不同也可分为两类:

带条件直接跳转/分支:

指目的地址从指令编码中的立即数可以直接计算而得。

带条件间接跳转/分支:

即跳转目标地址需要寄存器索引的操作数中计算得到


对于带条件跳转/分支指令,流水线在取指令阶段无法得知该指令是否成立,理论上指令只有在执行阶段完成之后,才能够解析出最终的跳转结果。假设处理器将取指暂停, 一直等到执行阶段完成才继续取指,则会造成大量的流水线空泡周期,从而影响性能。 为了提高性能,现代处理器的取指单元一般会采用分支预测( Branch Prediction )技术。


分支预测

一、预测方向。可以分为静态预测和动态预测两种

1)静态预测

静态预测不依赖于任何曾经执行过的指令信息和历史信息,仅依靠这条分支指令本身的信息进行预测。
a)简单的静态预测方法是总预测分支指令不会发生跳转,因此取指单元便总是顺取分支指令的下一条指令。待执行阶段之后如果发现需要跳转 ,则会冲刷流水线(Flush Pip line )重新进行取指。
b)BTFN 预测(Back Taken, Forward Not Taken ),即预测向后则跳转,向前则不跳转,比较目标PC值与当前分支指令PC值的大小来进行跳转与否的操作

2)动态预测

动态预测依赖已经执行过的指令的历史信息和分支指令本身的信息综合进行”方向“的预测
a)一比特饱和计数器。每次分支指令执行之后,便使用此计数器记录上次的“方向” 其预测机制是:下次分支指令永远采用上次记录的“方向”作为本次的预测 这种预测器结构最简单,但是预测精度不如两比特饱和计数器
b)“两比特饱和计数器。总共有四个状态,“强不需要跳转,强需要跳转,弱不需要跳转,弱需要跳转”其状态跳转如下图 
当为强/弱不需要跳转时,则预测不跳转,当为强/弱需要跳转时,则预测需要跳转。每次预测出错之后便会向着相反的方向更改状态机状态,譬如当前状态为“强需要跳转”,会预测为需要跳转,但是实际结果是不需要跳转,则需要将状态机的状态更新为弱需要跳转。
“两比特饱和计数器”对于预测一条分支指令很有效,但是处理器执行的指令流中存在着众多的不同分支指令(位于不同的 PC 值位置) 假设只使用一个“两比特饱和计数 器”在任何分支指令执行时均进行更新,那么必然会互相冲击,预测的结果会很不理想目前一般通过采用不同的表格组织方式(控制表格的大小)和索引方式(控制别名重合问题〉,来提供更高的预测精准率。

一级预测器

将有限个“两比特饱和计数器”组织成一维的表格,称为预测器表格( Predictor Table ),并直接使用 PC 值的 部分进行索引。譬如使用 PC 的后10 位作为索引,则仅要维护1000 表项的表格。
但一级预测起很多不同的分支指令都会指向同样的表项,并且由于没有考虑到分支指令的上下文执行历史,分支预测的精度不高

两级预测器

对于每条分支指令而言,将有限个“两比特饱和计数器”组织成 PHT ( Pattern History Tab)用该分支跳转的历史( Branch History )作为 PHT 的索引。假设用 n 个比特记录其历史 ( taken 或 not taken ),则可以索引 2的 n 次方个表项
分支历史( Branch History )又可以分为局部历史全局历史 。局部历史是指每个分支指令自己的分支跳转历史,而全局历史是指所有分支指令 的分支跳转历史
分支预测器(Branch Predictor )又分为局部分支预测器全局分支预测器。局部分支预测器(Local Branch Predictor )会使用分立的局部历史来保存不同指令的分支历史,每个局部历史缓存有自己对应的 PHT;全局分支预测器( Global Branch Predictor )则仅使用所有分支指令共享的全局历史缓存,全局分支预测器的 个很明显的弊端是它无法区分单独每个分支指令的历史,不同的指令会互相冲击,但是它的优势是比较节省资源。

二、预测地址

对于间接跳分支指令,由于分支目标地址需要使用寄存器索引的操作数(基地址寄存器)和指令字中的立即数进行加法运算,只能在流水线的执行阶段才计算出分支目标地址,这需要多个时钟周期才能完成,为了连续不断地取值,则需预测分支目标的地址。

1) BTB

分支目标缓存 (Branch Target Buffer, BTB )技术是指使用容量有限的缓存保存最近执行过的分支指 PC 值,以及它们的跳转目标地址。对于后续 要取指的每条PC值,将其与BTB中存储的各个 PC 值进行比较,如果出现匹配,则预测这是分支指令,并使用其对应存储的跳转目标地址作为预测的跳转地址。

2) RAS

返回地址堆枝( Return Address Stack, RAS )技术是指使用容 有限的硬件堆枝来存储函数调用的返回地址。只要程序是在正常执行,其函数的调用和返回成对出现,那么RAS便能够提供较高的预测准确率。不过由于RAS的深度有限,如果程序中出现很多次函数嵌套,需要不断地压入堆枝,造成堆枝溢出,则会影响到预测准确率。

3) Indirect BTB

间接BTB (indirect BTB )是指专门为间接跳转 分支 Cindirect Jump/Branch )指令而设计的BTB ,它与普通BTB类似,存储较多历史目标地址,但是通过高级的索引方式,结合了 BTB 和动态两级预测器的技术,能够提供较高跳转目标地址预测成功率但其缺点是硬件开销非常大,只有在高级的处理器中才会使用。
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
很高兴能回答您的问题。RISC-V是一个开源的指令集架构,其设计理念是简单、清晰、可扩展,因此在学术界和工业界受到广泛关注。下面是针对RISC-V指令集架构的流水线CPU设计的一些基本步骤: 1. 确定CPU的指令集架构:在设计流水线CPU之前,需要先明确需要支持哪些指令集,比如RV32I、RV64I等,以及是否需要支持扩展指令集,如M、A、F、D等。 2. 确定流水线阶段数:根据指令集架构的特点以及性能需求,确定需要多少个流水线阶段。一般来说,RISC-V CPU的流水线阶段数为5~7个。 3. 确定流水线寄存器:在流水线各个阶段之间需要插入寄存器来保存中间结果,以便下一个阶段使用。设计时需要根据实际情况确定寄存器的数量。 4. 确定数据通路:根据指令集架构的特点以及流水线阶段的数量,确定CPU的数据通路。数据通路包括ALU、寄存器堆、存储器等。 5. 确定控制信号:根据指令集架构的特点以及流水线阶段的数量,确定CPU的控制信号。控制信号包括指令译码、流水线寄存器写入使能、ALU控制信号等。 6. 进行时序分析:根据上述设计参数,进行全局时序分析,保证CPU的正确性和稳定性。 7. 进行性能优化:在保证CPU正确性和稳定性的前提下,可以对CPU进行性能优化,比如采用流水线暂停、预测分支等技术来提高CPU的执行效率。 这些是基本的步骤,具体的实现还需要根据实际情况进行调整和优化。希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俩个圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值