前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >处理器结构--分支预测(Branch Prediction)

处理器结构--分支预测(Branch Prediction)

作者头像
None_Ling
发布2018-10-24 14:42:56
3K0
发布2018-10-24 14:42:56
举报
文章被收录于专栏:Android相关Android相关

背景

条件分支指令通常具有两路后续执行分支。即不采取(not taken)跳转,顺序执行后面紧挨JMP的指令;以及采取(taken)跳转到另一块程序内存去执行那里的指令。是否条件跳转,只有在该分支指令在指令流水线中通过了执行阶段(execution stage)才能确定下来。

如果没有分支预测器,处理器将会等待分支指令通过了指令流水线的执行阶段,才把下一条指令送入流水线的第一个阶段—取指令阶段(fetch stage)或者将后续流水线全部清空。这种技术叫做流水线停顿(pipeline stalled)或者流水线冒泡(pipeline bubbling)或者分支延迟间隙。最初的RISC体系结构处理器采用的应对分支指令的流水线执行的办法。

原因

分支预测器猜测条件表达式的两路分支中哪一路最可能发生,然后推测执行这一路的指令,来避免流水线停顿造成的时间浪费。如果后来发现分支预测错误,那么流水线中推测执行的那些中间结果全部放弃,重新获取正确的分支路线上的指令开始执行,这招致了程序执行的延迟。

在分支预测失败时浪费的时间是从取指令到执行完指令(但还没有写回结果)的流水线的级数。现代微处理器趋向采用非常长的流水线,因此分支预测失败可能会损失10-20个时钟周期。越长的流水线就需要越好的分支预测。

一条条件跳转指令第一次遇到,还没有任何信息可以去预测分支。此后保持这条指令是采取还是不采取跳转的历史记录,就可以作为再遇到这条指令时猜测最可能的分支。

实现

主要包括两类预测器: 静态预测器(Static Predictor)以及动态预测器(Dynamic Predictor)

静态预测器

预测条件跳转不发生,因此总是顺序取下一条指令推测执行。仅当条件跳转指令被求值确实发生了跳转,则非顺序的代码地址被加载执行。另外一种,则预测条件跳转总会发生,因CPU而异。对于这种静态预测如果产生错误,则惩罚就是清空后续的PipeLine中的指令。

而另外一个静态预测器就是LSD:Loop Stream Decoder

Loop Stream Decoder

传统的分支预测流程是: 分支预测-->取指-->解码

传统的分支预测流程

而LSD的目标就是检测CPU是否处于程序的Loop(for,while,do---while)中,如果处于Loop中,则会停止分支预测,并且为将LSD中的存储的指令流向ReoderBuffer。

其中分支预测和取指硬件将会被禁用,并且会将28条Micro-Ops保存在LSD中,并且将指令一遍遍传入ROB直到Loop完成或者跳出循环。

LSD工作时流程

动态预测器与BTB(Branch Target Buffer)

基于之前执行的分支信息,处理器对于正在执行的程序所做的决定。最简单的一种就是:1-bit动态预测,比如Alpha 21064 RISC处理器就使用这种。

原理:根据该指令上次是否跳转来预测此次是否跳转。如果上次跳转,则预测此次也会跳转。

而更好的一种方案是n-bit动态预测。 例如2bit动态预测器。以下为2bit动态预测器工作原理:

  • 当处于处于00状态时候,预测顺序分支
    • 预测成功,仍处于00状态
    • 预测失败,则调整为01状态
  • 当处于01状态时,继续预测顺序分支
    • 预测成功,则调整为00状态
    • 预测失败,则调整为10状态
  • 当处于10状态时,预测其他分支
    • 预测成功,则调整为11状态
    • 预测失败,则调整为01状态
  • 当处于11状态时,预测其他分支
  • 预测成功,仍处于11状态
  • 预测失败,则回退到10状态

2-bit动态预测器

而另外一种变种的2-bit动态预测器如下图所示:

变种2-bit动态预测器

标记分支状态以及分支历史的一段内存被称为BTB,这段内存非常小,仅仅只存储了分支指令地址,以及预测的目标地址,以及预测的位。

当一个分支指令第一次执行时,处理器为该指令分配一个Entry放入BTB中,当指令读取请求的时候,将该指令同步放到L1的Instruction Cache以及BTB中,如果在BTB中Match上该指令,Branch Target Address将会从BTB中被读取。当指令分支执行完毕后,它的Target Address也会在BTB中被更新,Prediction Statistics也同样会更新。

Branch Target Buffer

通常静态分支预测方法不需要太多硬件资源,不过它会提高编译器的复杂度,同理动态预测方法会增加硬件的复杂度,但是对编译器的要求不会太高。通常动态预测的结果会比较好,并且在编译期后决定分支,对面向对象的代码提供了更好的兼容性。

分支预测正确与错误的惩罚

参考资料

维基百科-分支预测 SSCE-Branch-Predict Improved Loop Stream Detection

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.06.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 原因
  • 实现
    • 静态预测器
    • Loop Stream Decoder
    • 动态预测器与BTB(Branch Target Buffer)
    • 参考资料
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档