Pentium II Pentium III架构/微架构/流水线 (2) - P6详解 - 前端(指令预取/译码/动态分支预测静态分支预测)
Pentium II & III Instruction Pipeline Details
Front-End Pipeline Details
Pentium II & III处理器的指令流水线前端包括3个主要的部件:指令预取单元,译码器,和分支预测单元。
Instruction Prefetcher
指令预取单元总是积极地从指令缓存中预取指令流。Pentium II & III处理器总是从16字节对齐的地址边界上读取指令流。例如,如果有一个分支目标地址模上16之后等于14,则在第一个预取周期中,只能有2个字节的有用指令能被获取到(前14个无关指令字节会被废弃),随后的指令必须在接下来的预取周期中读取,这样有可能造成流水线饥饿状态,即缺少或无指令可以执行。
注意:指令预取总是期望读取对齐的16字节指令流。
Decoders
Pentium II & III处理器有3个译码器。在每个时钟周期,第一个复杂译码器可以将1条x86指令翻译成1至4条微指令。它可以处理最长达15字节的x86指令,但是9个字节或更长的指令需要额外的时钟周期。另外两个简单译码器可以各译码1条x86指令,将其各翻译成1条微指令,可以处理最长达8个字节的x86指令。对于译码后多于4条微指令的x86指令,需要多个时钟周期来译码。
简单的x86指令对应1至4条微指令;复杂的x86指令,例如CMPXCG指令,通常对应超过4条微指令,需要多个时钟周期来译码。
综上所述,在每个时钟周期内,最多可以译码3条x86指令。但是,如果是复杂x86指令或者指令长度超过7字节(TODO:校验7字节这个值),译码器只能译码更少的指令。
- 每个时钟周期最多译码3条x86指令
- 每个时钟周期产生最多6条微指令(复杂译码器4条+2个简单译码器各1条)
所以,当使用汇编语言进行程序设计时,尝试将x86指令调度(即指令设计顺序)成4-1-1微指令顺序,也就是生成4条微指令的x86指令后紧跟着两条只生成1条微指令的x86指令。这样这3条x86指令可以在一个时钟周期内译码完毕,达到最佳的译码吞吐量。
下面给出一个x86指令对应的微指令条数的参考,更详细的信息可以参考Intel文档,order#: 245127-01。
- 寄存器到寄存器这种形式的简单指令对应1条微指令
- 加载指令对应1条微指令
- 存储指令对应2条微指令
- 简单的读取-修改指令对应2条微指令
- 寄存器到存储器这种形式的简单指令对应2至3条微指令
- 简单的读取-修改-写回指令对应4条微指令
Branch Predication Overview
Pentium II & III处理器使用分支目标缓存区预测分支指令的方向和目标(基于分支指令的地址)。分支指令的地址在译码前就可获得,所以基于分支目标缓存区的预测机制可以尽可能早的进行分支预测,而从避免指令执行流进入错误的方向而产生停顿。拥有512个条目的分支目标缓存区存储着先前看见过的分支指令以及它们各自的目标地址。当1条分支指令被预取到时,分支目标缓存区为指令预取单元提供该指令的目标地址。一旦该分支被真正执行,实际跳转目标地址会被更新到分支目标缓存区中。因此,使用分支目标缓存区可以动态的预测以前见过的分支指令。
一旦分支指令被译码,分支的方向(前向或后向)也即获得。如果在分支目标缓存区中找不到某个分支指令,则静态分支预测器会根据分支指令的方向进行预测。
Dynamic Prediction
分支目标缓存区的预测算法包括模式匹配以及跟踪每条分支指令过去最近的4个分支方向。例如,4次或少于4次迭代的循环指令理论上可以被100%正确地预测。
此外,Pentium II & III处理器有一个返回栈缓存区,这个缓存区可以用于预测一系列过程调用的返回地址。对于含有过程调用的循环展开优化方法,这个缓存区增加了性能收益。它也缓和了对内联函数的使用需求,因为过程调用的返回时间成本降低了。
按性能损失的时钟周期数量化计算,Pentium II & III处理器对分支指令提供了3级的支持:
- 未采纳分支没有性能损失。本级适用于a) 被分支目标缓存区正确预测为未采纳的分支,b) 不存在于分支目标缓存区中的前向分支(默认被预测为未采纳)
- 被分支目标缓存区正确地预测为采纳的分支会有一个1时钟周期的微性能损失。与任何采纳分支一样,对紧跟着分支语句之后的指令进行的译码都将被废弃。
- 预测失败的分支会遭受严重的性能损失,读取指令至少是9个时钟周期(即流水线的有序前端的长度),加上额外的周期等待预测错误的分支指令终了。这个损失要看当时的执行环境。典型地,预测失败是10至15周期的损失,最长可达26周期。
Static Prediction
不存在于分支目标缓存区中的分支指令,但是被静态预测机制正确地预测的分支,会产生大于5至6个时钟周期的小性能损失(流水线起始到静态预测点的长度)。这适用于以前没有见过的无条件直接分支语句。
静态预测算法会将回跳条件分支指令(即分支指令具有负位移量),例如循环语句比较循环条件,预测为采纳。当第一次遇见这种分支指令时,会产生大约6个周期的小性能损失;随后的每次迭代,分支目标缓存区可以正确的预测回跳分支指令,只会有1个周期的微性能损失。前向跳转分支指令会被预测为未采纳。
不在分支目标缓存区中,但是被译码器正确预测的分支指令会有大约5个周期的小性能损失。
要充分利用前向分支不采纳以及回跳分支采纳的静态预测机制,代码应该被安排成最可能执行的代码紧跟着前向分支语句,即
if (condition) { likely_executable_code; } // forward branch predicted not // taken by static predictor else { unlikely_executable_code; } |
Pentium II Pentium III架构/微架构/流水线 (2) - P6详解 - 前端(指令预取/译码/动态分支预测静态分支预测)相关推荐
- Pentium II Pentium III架构/微架构/流水线 (4) - P6详解 - 高速缓存/Store Buffers
Caches of the Pentium II &I III Processors Pentium II & III处理器的片上高速缓存子系统由2个16K字节的4路组相联高速缓存组成 ...
- Pentium II Pentium III架构/微架构/流水线 (7) - 微架构框图
Pentium II的微架构 下面这幅图来自于CSE 3322-001 (Fall 1999),在Mindshare的Pentium Pro体系结构一书中也有类似的图. 注意:Pentium II处理 ...
- Pentium II Pentium III架构/微架构/流水线 (3) - P6执行核详解 (指令时延吞吐量,执行单元/发射口)
Execution Core Detail 要想实现指令执行并行,就必须要知道各个执行单元的延迟信息.执行单元在流水线上的布局信息以及流水线上执行的微指令信息也很重要.本节会详细讲述执行核的操作,包括 ...
- 阿里架构总监一次讲透中台架构,13页PPT精华详解,建议收藏
阿里架构总监一次讲透中台架构,13页PPT精华详解,建议收藏 https://www.toutiao.com/i6733390971112784391/?tt_from=weixin&utm_ ...
- 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵
转自:图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 ...
- 图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵
图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 模型矩阵:模型局部坐标系和世界坐标系之间的桥梁 1.模型局部坐标系存在的意义 2.根据模型局部坐标系中点求其在世界坐标 ...
- Pentium II Pentium III架构/微架构/流水线 (1) - 架构概述
Pentium II & III Archiecture Overview Pentium II & III与Pentium Pro一样,都是基于P6微架构的处理器,所以在架构与流水线 ...
- Pentium II Pentium III架构/微架构/流水线 (6) - SSE
Streaming SIMD Extensions (SSE) 相比Pentium II处理器,Pentium III处理器上的流式单指令多数据扩展(SSE)技术更加提升了程序,例如三维图形处理,的性 ...
- Pentium 4处理器架构/微架构/流水线 (3) - NetBurst微架构
Pentium 4 Intel® NetBurst™ Micro-architecture Details Pentium 4处理器是Intel全新NetBurst微架构 的第一代处理器实现(其实也是 ...
最新文章
- VTK:Filtering之ConnectivityFilter
- 计算机网络传输层和应用层作业,计算机网络传输层作业.doc
- php input 数组的值,如何获取2值表单输入数组到PHP数组中(How to get 2 value form input array into PHP array)...
- java亮剑_黄金矿工3-太空版
- 阻尼衰减曲线用python_高阻尼橡胶支座隔震原理
- Codeforces 977D: Divide by three, multiply by two(暴力)
- Android Studio 无法浏览插件市场
- mysql time转换输出_MySQL将timediff输出转换为日,时,分,秒格式?
- java实体类实现抽象类_java接口、抽象类、实体类关系介绍
- malloc calloc realloc
- json与对象互转:json转实体类、实体类转json、json转List、List转json
- Prolog语言及程序设计汇总
- 地下城与勇士(DNF)异次元裂缝副本(哥布林王国、蠕动之城、兰蒂卢斯的鹰犬、黑色大地、虚无之境 、巴卡尔之城)(童年的回忆)
- python爬取公众号文章_python爬取微信公众号历史文章
- 爬虫入门 ---- CSDN查看文章全部评论
- 护眼灯对孩子眼睛好吗?盘点最好的儿童护眼灯品牌
- 2022按键精灵内存逆向新教程:乐玩篇:1-10课更新试看
- PLM系统应用案例:重庆通用工业(集团)有限责任公司
- 猫影视配置2022.06.04
- Hopf-Cole 变换与高阶差分格式(Burgers方程)
热门文章
- 【文献学习】矩阵投影
- python xlsxwriter dict_python_xlsxwriter模块
- mysql 1021 disk full_大分区使用xfs文件系统存储备份遇到的问题
- Postman 报错SSL Error: Self signed certificate Disable SSL Verification
- Android 自动扫描歌曲,Android扫描本地音乐文件开发案例分享
- 浙大慕课c语言答案,程序设计入门——C语言
- python类的初始化方法_python学习之-对象的的初始化与__init__方法
- c语言中1%100是什么意思,**************
- MongoDB入门示例及介绍
- 查询:使用多表连接查询数据