Pentium Pro Instruction Pipeline Details

处于讲解指令流水线的需要,接下来我们详细的讲解一下Pentium Pro微架构中的相关单元。上图是Pentium Pro处理器微架构的功能框图,从中可以看到一些功能模块和子系统

  • 内存子系统 – 系统总线,二级指令/数据合并缓存,总线接口单元,一级指令缓存,一级数据缓存,内存接口单元和内存访问排序缓存区
  • 取指/译码单元 – 指令预取单元,分支目标缓存区,指令译码器,微指令序列器,和寄存器别名表
  • 微指令池 – 微指令排序缓存区
  • 分发/执行单元 – 执行资源分配站,两个整型单元,两个浮点单元,和两个地址计算单元
  • 终了单元– 终了单元和终了寄存器堆

Memory Subsystem

Pentium Pro处理器的内存子系统由系统DRAM内存,一级缓存,二级缓存构成。

Cache

一级缓存包括8K字节的指令缓存和8K字节的数据缓存。二级缓存有多种规格,主频在150/166/180MHz的处理器使用256KB的二级缓存,主频在200MHz的处理器搭配有3种规格的缓存:256K字节,512K字节和1M字节,以当时的价格来看,非常昂贵。

一级缓存运行频率与CPU频率相同,访问一级缓存通过CPU内部总线完成。

一级指令缓存是8K字节大小的4路组相联高速缓存;一级数据缓存是8K字节2路组相联高速缓存,支持双端口操作,可以在单个时钟周期内一次存操作和一次取操作。指令缓存只有取操作。一级缓存的缓存行大小都是32字节。

总线接口单元通过外部系统总线访问系统内存。外部总线是64位的事务型总线,也就是说每一次总线访问都是由一对儿独立的请求操作和响应操作完成。总线接口单元在等待某个请求的响应时,还可以发射数个额外的请求操作。

总线接口单元通过64位宽的高速缓存总线访问紧耦合的二级缓存(这里紧耦合指的是二级缓存位于CPU芯片上,且与CPU工作在同频率上)。高速缓存总线也是事务型总线,支持最多4个并发的缓存访问。

Cache Consistency Protocol (MESI)

高速缓存与系统内存的数据一致性由MESI缓存一致性协议来保障。MESI代表高速缓存中某个缓存行可能的四种状态,分别是:修改过modified,独有exclusive,共享share和无效invalid。无论是单CPU还是多CPU系统,MESI协议都可以保证缓存一致性,也可以用于检测由自修改代码导致的一致性问题。TODO:解释自修改代码

来自处理器执行单元的内存访问请求将会经过内存接口单元和内存访问排序缓冲区。这两个单元用来支持在缓存和系统内存各级之间流畅地访问数据以避免内存访问阻塞。在一级缓存未中的情况下,一级缓存会自动地将请求转发到二级缓存,如果还未中,总线接口单元会继续将请求转发到系统内存。

到二级缓存和系统内存的请求会经过内存访问排序缓冲区。该缓冲区类似于一个调度/分发站,它会跟踪所有的内存请求,必要的情况下会重排序某些请求以避免访问阻塞,提高吞吐量。例如,该缓冲区允许先做读操作,再做存操作;也可能做一些预测式地“投机”读操作;但是所有存操作都是按顺序完成,而且从来不会做预测式地“投机”存操作。

Fetch/Decode Unit

取指单元从一级指令缓存中读取IA指令流,译码单元将其翻译为微指令序列,也称为uop序列或者uop流。这个uop流依然保持着最初程序设计时的指令顺序被发送到微指令池中。

取指单元每个时钟周期从指令缓存中读取32字节的指令流,标示出该指令流中每条IA指令的边界,最后将按16字节对齐的字节流发送到译码器。参看下图,在第一个时钟周期内,指令1和指令2会被发送到指令译码器;但是指令3不会,因为指令3跨越了16字节边界,指令3(和后续的指令)将会在下一个周期送到译码器.

取指单元会综合下列情况计算指令指针的值,指令指针确定了下一条要执行的指令。

  • 来自分支目标缓存区的输入
  • 异常/中断的状态
  • 来自整型执行单元的分支预测失败

计算过程中最重要的部分是分支目标缓存区提供的分支预测信息。 使用了扩展的Yeh’s算法,拥有512个条目的分支目标缓存区可以提前检查许多条指令。在这些指令中可能有许多的分支跳转,过程调用,和返回指令,要想让分发/执行单元更有效率的工作,就必须要准确地预测各种分支指令。

指令译码器包括三个独立并行的译码器:2个简单指令译码器和1个复杂指令译码器。一个译码器可以将一条IA指令转换成一条或多条三操作数的微指令(每条微指令有一个逻辑目标操作数,两个逻辑源操作数)。 微指令才是处理器中的6个并行执行单元执行的基本指令。换句话说,从Pentium Pro开始,处理器的执行单元不再执行IA指令,而是类RISC指令的微指令。Intel并没有公布微指令的指令集和细节,程序员要关心的依然是IA指令集。

许多IA指令可以由简单译码器直接转换成单条微指令,还有一些IA指令由复杂译码器转换成1至4条微指令。更复杂的IA指令只能由微指令序列器译码成预编程的微指令序列(the more complex Intel Architecture instructions are decoded into sequences of preprogrammed micro-ops obtained from the microcode instruction sequencer)。

The MS ROM is used for CISC instructions not fully decoded by the default decoders (like repeat move strings), or by microcode assists used to address some modes of operation (like in Floating-Point assists).

指令译码器也会处理指令前缀和循环操作。所有的译码器可以在单个时钟周期内转换最多达6条微指令(两个简单译码器产生2条微指令;复杂译码器产生4条微指令)。

Intel架构的寄存器组数量太少,由于寄存器相互依赖可能导致资源僵死问题。为了解决这个问题,处理器提供了40个程序员不可见的内部通用寄存器用来执行真正的计算操作。这些寄存器可以保存整型和浮点型值。为了分配这些内部寄存器,微指令从指令译码器送到寄存器别名表单元。在这里,对逻辑IA寄存器的引用会被转换成对内部物理寄存器的引用。

注:当有了寄存器别名(重命名)机制后,IA寄存器已经无需参与实际计算,所以称为逻辑寄存器;真正参与计算操作的内部寄存器被称为物理寄存器。

译码阶段的最后一步是由寄存器别名表单元的分配器给微指令加上状态位和标志位,自此这些微指令即将可以被送入指令池进行乱序执行。

Instruction Pool (Reorder Buffer)

在进入微指令池(以前也被称为微指令重排序缓存区)之前,微指令的顺序是严格按照IA架构程序设计时的顺序排列的,没有经过任何的重排序。

微指令池是一个可以按内容查找的数组内存区,被分配进了40个微指令寄存器。它保存着即将被执行的微指令,以及已经执行过但是还未提交的微指令。这里“提交”指的是微指令已经执行完毕,执行结果被写回到指令指定的IA寄存器中,即程序员可见的机器状态。分发/执行单元可以按任何顺序从微指令池中提取微指令执行。

Dispatch/Execute Unit

分发单元和执行单元是乱序执行单元,根据微指令操作数的依赖关系和执行单元资源的可用情况,调度和执行存储在微指令池中的微指令以及临时存储预测式投机执行的微指令的执行结果。

从指令池中调度和分发微指令的操作由微指令执行资源分配站完成,它持续地扫描微指令池,查找到可以执行的微指令(即源操作数都已经可用),将其分发到可用的执行单元。微指令的执行结果会被送回指令池,与对应的微指令存储在一起直到该微指令终了。调度和分发过程使用经典的乱序执行策略,微指令严格按照数据流的约束关系和执行资源的可用性被分发到执行单元中执行,不再考虑原始程序设计时的指令顺序。当两条或多条同类型的微指令(例如,整型操作)同时可以执行时,他们按照一个伪先入先出的队列顺序执行。

微指令的执行单元包括2个整型单元,2个浮点单元,和1个内存接口单元,使得每个时钟周期内同时可以执行最多可达5条微指令(注意是微指令,不是IA指令)。

2个整型单元可以并行的执行整型两条微指令。其中有一个整型单元还可以处理分支微指令,这个单元可以侦测到分支指令预测失败,然后通知分支目标缓存区BTB重启指令流水线(重启意味着性能损失)。下面是详细的操作步骤。指令译码器会为每条分支微指令打上两个分支目标地址(预测的跳转目标地址和非跳转地址)。当整型执行单元执行分支微指令时,它可以确定是否发生了跳转(或者未跳转顺序执行)。如果发生了跳转,则预测式“投机”执行的那些微指令将会被标记为可用,执行流会沿着预测的指令路径继续执行;如果没有发生跳转,整型单元中的跳转执行单元会更该这些微指令的状态,以便将他们从微指令池中删除,然后给分支目标缓存区BTB提供正确的跳转地址,随后BTB将会从新地址重启流水线。

内存接口单元负责处理加载load和存储store微指令。加载操作只需要指定内存地址,所以可以编码在1条微指令中。存储操作需要同时指定要写入的内存地址和数据,所以需要编码成2条微指令。内存接口单元中的存储操作部分有两个端口,可以并行的处理地址和数据。因此,内存接口单元可以在1个时钟周期内同时执行1个加载和1个存储操作。

浮点执行单元与Pentium处理器中的浮点单元类似,只是增加了数条新的浮点指令以便于将条件分支和move指令流水线化。

Retirement Unit

简单的说,终了单元按照一定的条件将微指令的执行结果回写到程序员可见的IA寄存器中,然后将微指令从微指令池中删除。但是还有些细节要考虑,就如微指令执行资源分配站reservation station,终了单元持续的扫描微指令池,找到那些已经执行过的微指令,而且这些微指令也不再被其他的微指令依赖。对于这些微指令,同时会考虑到中断,异常,断点以及分支预测失败等情形后,终了单元才会对其执行终了操作:严格按照程序设计顺序回写结果后删除微指令。

每个时钟周期,终了单元可以处理完成3条微指令。对每条微指令,终了单元会将执行结果提交(即回写)到IA寄存器堆或/和内存中,然后将其从微指令池中删除。这里IA寄存器堆包括8个通用寄存器,8个浮点数据寄存器。

Pentium Pro架构/流水线及其优化 (2) - 指令流水线 存储子系统详解相关推荐

  1. Pentium Pro架构/流水线及其优化 (3) - 指令流水线/乱序执行核/高速缓存/分支预测/指令预取

    Instruction Pipeline 关于Pentium Pro的指令流水线,我从4个来源看到3种不同的说法:11级,12级和14级(没有13级说,不大吉利吧).其实大同小异,不用纠结到底是多少级 ...

  2. Pentium Pro架构/流水线及其优化 (1) - 架构概述

    Pentium Pro Architecture Overview Intel在1995年发布的Pentium Pro是第6代x86架构处理器,基于P6微架构.由于1993年的Pentium使用的超标 ...

  3. Pentium奔腾架构/流水线及其优化

    Pentium Architecture Overview Intel在1993年发布的Pentium是一款先进的超标量处理器.相比起80486,Pentium的功能模块更加复杂: 一级高速缓存单元从 ...

  4. Android性能优化之APK瘦身详解(瘦身73%)

    image 公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段. ...

  5. 从Java程序员进阶到架构师,6大核心技能要领详解

    " java架构师技能将分为如下6大环节:数据结构和算法,Java高级特性,Java web核心,数据库,Java框架与必备工具,系统架构设计. 希望能真正帮助到从程序员进阶到架构师之路的朋 ...

  6. 数学建模——智能优化之粒子群模型详解Python代码

    数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...

  7. Android 性能优化(62)---存检测、卡顿优化、耗电优化、APK瘦身——详解篇

    Android 性能优化,内存检测.卡顿优化.耗电优化.APK瘦身--详解篇 自2008年智能时代开始,Android操作系统一路高歌,10年智能机发展之路,如今 Android 9.0 代号P  都 ...

  8. 搜索引擎排名优化与五个技巧详解

    对于搜索引擎排名,每个SEO人员都有自己的独门秘籍,通常它都会根据自己所处的行业,进行有针对性的优化,但万变不离其宗,对于任何行业,它的排名机制,都是建立在满足一定搜索需求的基础之上. 言外之意,万丈 ...

  9. Pro Tools购买、升级、升级计划续期详解

    Pro Tools购买.升级.升级计划续期详解 2018-03-13神游技术人生之AVID音频 本文介绍Pro Tools软件的产品类型和差异,购买时如何衡量和选择? 升级计划是什么? 如何续订或恢复 ...

最新文章

  1. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说
  2. Python数据结构——tuple
  3. 如何将 Nginx 性能提升10倍?这10个“套路”请收好!
  4. 文件描述符与打开文件的关系
  5. 日志处理(二) 日志组件logback的介绍及配置使用方法(转)
  6. 扒一扒面向对象编程的另一面
  7. Android8.0 学习(15)---适配Android 8.0
  8. Rabbitmq的三种方式
  9. ExtJs4 基础必备
  10. 内网群PING的shell
  11. Backtrack5 bt5 VMware Tools 安装失败的解决办法
  12. phpWord 读取word模板,替换相应变量
  13. Android dp方式的屏幕适配工具使用(Android Studio插件方式)
  14. 测试面试题集锦(六)| 软素质篇与反问面试官篇(附答案)
  15. java 账本 创建数据库_想用你所学的JAVA与数据库写一个属于自己的账本吗?一起来看看呗!看如何用java项目操作数据库...
  16. 计算机弹歌光年之外谱子,光年之外-G.E.M. 鄧紫棋-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
  17. 与airpods媲美的无线耳机推荐
  18. 教你用python画不同类型的心形图虏获芳心,值得收藏!!
  19. anaconda清华源
  20. NFC Bank card: 以移动浦发联名挂件卡解析qPBOC应用

热门文章

  1. 第一、二类斯特林(Stirling)数的生成函数(母函数)及推导
  2. QT新建项目显示项目未配置的原因与解决方案
  3. linux 高并发文件实时同步,Linux海量数据高并发实时同步架构方案杂谈
  4. MySQL模糊查询的那些谣言
  5. 如何在参考文献中优雅地引用URL?How do you get nicely formatted URLs in the bibliography?
  6. sop4封装尺寸图_妈妈再也不用担心我PCB封装又做错了~
  7. linux内核module_init,Linux内核模块中module_init和init_module有什么区别?
  8. mysql markdown_mysql+数据库学习笔记(markdown)
  9. python自动测试a_python自动化单元测试
  10. ext2fsd打开提示硬盘格式化_苹果Macbook电脑安装win10系统教程及错误提示信息解决方法...