目前的通用处理器从指令集方面可分为RISC和CISC。CISC伴随着处理器的诞生,最开始的处理器都是使用这种指令集,力求在一条指令内完成很多事情,并且使用尽可能多的指令,覆盖到各种各样的操作,这就可以降低对存储器的需求,并且简化编译器的设计。

当存储器和编译器不在是问题时,RISC产生了。因为80%的CISC指令只在20%被使用,则可以将经常使用的20%的CISC指令使用硬件来实现,剩余80%的指令可以使用软件来模拟,于是简化硬件的设计,也便于使用流水线。

不像可以变化长度的CISC指令,RISC指令采用32位等长方法。如此可以降低解码难度,易于流水线的设计。使得RISC指令集有着更高的频率,同时功耗和成本相对也更低。

标量处理器是指:每周期最多只能执行一条指令,它一般都是按照程旭中指定的顺序来执行指令,这称为顺序执行(in-order)。这制约了处理器性能的提高。

超标量处理器:一个周期执行多条指令。处理器可以按照程旭中指定的顺序来执行,也可以不遵守这个顺序。只要指令的源操作数都准备好了,它就可以被执行,被称为乱序执行(out-of-order)。当然有一些方法使这些乱序执行的指令看起来仍然按照程序中指定的顺序更改处理器的状态,在超标量处理器中的这些功能注定了它的复杂性,以及更多的硬件资源和更高的功耗,目的就是性能提升。

上述的CISC和RISC、以及scalar和superscalar是相互正交的。产生四种组合:

Scalar CISC:处理器最开始的时候采用的结构,这种结构一般会直接对CISC指令进行解码,甚至可能不使用流水线,目前已逐渐淘汰。

Scalar RISC:这是RISC处理器刚刚出现的时候采用的结构。由于RISC指令级降低了对硬件的要求,并且便于流水线的实现,所以此结构处理器多使用流水线来提高性能,它的主频一般比较高,成本也低。嵌入式低功耗领域的处理器均采用这种结构。

Supercalar RISC:随着对处理器性能需求越来越高,每周期执行一条指令的处理器已经不能满足需求了。为什么首先出现在RISC处理器呢?因为RISC指令级比较规整,便于硬件实现。主要服务于嵌入式的高性能应用领域。

Superscalar CISC:尽管CISC并不容易使用流水线来实现,更难直接使用超标量结构来实现,但是Intel和AMD在处理器内部使用硬件将一条CISC的指令转换为RISC指令,这样充分使用了RISC指令集的优势。当然,比普通的RISC处理器要付出更多的硬件资源,功耗也会偏大。

在上述4种结构中,本文重点关注Superscalar RISC处理器设计。该处理器的流水线则贯穿本书的主线,一条指令从程序存储器中取出来之后,需要经过流水线的各个阶段,最后才能得到结果,并更新处理器的状态。

本书内容按指令的轨迹来组织:

第1章:介绍普通处理器和超标量处理器的一些背景知识。

第2章: Cache,这是由于一般的指令都是从I-Cache中取出来并送到流水线中,因此流水线始于I-Cache。当然,处理器也存在D-Cache。不同结构的Cache对处理器的性能有着重要的影响,尤其在超标量处理器中,每周期需要同时执行多条指令,这给Cache的设计带来一些挑战。

第3章:虚拟存储器(Virtual Memory),因为处理器在取指令的时候,如果送出来的是虚拟地址,那么首先需要转化为物理地址,然后才能取到指令,对数据的访问也是类似的,虚拟存储器是现代操作系统运行的基础,在处理器中需要软硬件配合工作,才可以对虚拟存储器提供完整的支持。

第4章:分支预测(Branch Prediction),也是取指令阶段发生的事情,因为超标量处理器的流水线一般比较深,导致分支指令的结果在很晚的时间才可以得到,一旦发现这个结果跟预想的不一样,那么流水线中很多指令都是没有用的,需要抹掉并从正确的地址取指令,这样就降低了处理器的执行效率,因此需要对分支指令使用比较准确的预测算法,从而在取指令阶段就得到可以提前知道分支指令的结果。

第5章:指令集体系(ISA),一旦指令在从存储器中取出来之后,下一步就需要进行解码,不同的指令集需要不同的解码方式,因此本书在介绍指令的解码之前,首先对基本的RISC指令集进行介绍这样便于对后续流水线的理解。

第6章:指令解码(Decode),在超标量处理器中,由于每周期需要对多条指令进行解码,这会引入一些新的问题,比如指令之间的相关性,以及一些复杂指令的处理等,相比于普通的处理器,它的解码过程要复杂一些,但是相比于超标量CISC处理器这种解码过程仍然是比较简单的。

第7章:硬件的寄存器重命名(Register Renaming),指令经过解码之后,就可以得到它的源寄存器和目的寄存器了,但是为了尽量并行地执行指令,需要消除指令之间存在的假的相关性,这些相关性都是和寄存器的名字相关的,通过使用不同的寄存器名字,可以消除这些相关性,于是在处理器内部使用了数量多于指令级中定义的寄存器,称之为物理寄存器,而指令集中定义的寄存器则称为逻辑寄存器,寄存器重命名的过程就是将逻辑寄存器动态地映射到不同的物理寄存器,以消除指令之间存在的假的相关性,从而使这些指令可以并行执行。

第8章:指令发射(Issue),当指令经过寄存器重命名后,就可以在处理器内部的功能单元(FU)中执行了。但是为了获得更高性能,超标量处理器多采用乱序执行的方式,只要一条指令的操作数准备好了,即使它之前的指令还没有准备好,它也可以送到FU中执行,这种方式可以最大限度地利用处理器内部的硬件资源,从而提高处理器的执行效率,而发射阶段正式用来实现此功能的。所有经过寄存器重命名的指令都会放到一个缓存中,这个缓存称为发射队列(Issue Queue),在其中检测每条指令是否已经准备好了,并按照一定算法,从那些已经准备好的指令中选择合适的指令送到FU中执行,这个过程就成为发射,指令到了这个阶段,就变成乱序执行了。而在此阶段之前,都遵循着程序中指定的顺序。

第9章:指令在功能单元的执行(Execute),指令被发射之后,就会到相应的FU中开始执行,不同种类的指令需要不同的FU,在超标量处理器中,都会使用多个FU,它们可以并行地执行不同的指令。本章除了介绍常见的FU之外,还会介绍旁路网络(Bypassing Network),它可以缩短相关指令之间执行的时间,但是却使处理器内部的布线资源变得更复杂,因此现代的一些处理器采用了Cluster结构来缓解这种矛盾,同时,访问存储器的load/store指令也需要一些特殊的方法来加速它们的执行速度。

第10章:流水线最后阶段:提交(Commit),指令经过FU的执行而得到结果后,并不会马上使用这个结果对处理器转态进行更新,这是由于指令的执行是按照乱序来进行的,由于分支预测失败(mis-prediction)和异常(exception)等原因,一条指令的结果未必是正确的。而且,为了使程序在处理器内部的执行看起来和程序指定的顺序是一样的(这是串行程序必须的),也需要这些乱序执行的指令按照程序中指定的顺序对处理器转态进行更新。为了实现这个功能,一条指令在FU中执行完毕后,并不会马上对处理器的状态进行更新,而是先将它的结果写到一个缓存中,这个缓存称为重排序缓存(Reorder Buffer, ROB)。在流水线的寄存器重命名阶段,每条指令都已经按照程序中指定的顺序写到ROB中,当一条指令在FU中执行完毕,就可以将结果写到ROB对应的地方,当ROB中最旧的那条指令(或者几条指令)已经得到结果,并且不存在分支预测失败或者异常等特殊情况,它就可以离开ROB,使用它的结果对处理器的状态进行更新,这个过程称为指令的退休(retire),一旦指令经过这个状态,它就在不能被撤销了。

第11章:RISC处理器案例:Alpha 21264处理器。

超标量处理器设计 姚永斌 前言 摘录相关推荐

  1. 超标量处理器设计 姚永斌 第9章 指令执行 摘录

    9.1 概述 执行阶段负责指令的执行,在流水线的之前阶段做了那么多的事情,就是为了将指令送到这个阶段进行执行.在执行阶段,接受指令的源操作数,对其进行规定的操作,例如加减法.访问存储器.判断条件等,然 ...

  2. 超标量处理器设计 姚永斌 第8章 指令发射 摘录

    8.1 概述 何为发射?它就是将符合一定条件的指令从发射队列issue queue中选出来,并送到FU中执行的过程.发射队列页可以叫做保留站reservation station. 发射队列会按照一定 ...

  3. 超标量处理器设计——第二章_Cache

    超标量处理器设计--第二章_Cache 参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第二章_Cache Cache的一般设计 2.1.1 cache组成方式 2.1.2 C ...

  4. 超标量处理器设计——第八章_发射

    超标量处理器设计--第八章_发射 参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第八章_发射 8.1 简述 8.1.1 集中式 VS. 分布式 8.1.2 数据捕捉 VS. ...

  5. 超标量处理器设计——第四章_分支预测

    超标量处理器设计--第四章_分支预测 参考<超标量处理器>姚永斌著 4.1 简述 分支预测主要与预测两个内容, 一个是分支方向, 还有一个是跳转的目标地址 首先需要识别出取出的指令是否是分 ...

  6. 超标量处理器设计——第七章_寄存器重命名

    超标量处理器设计--第七章_寄存器重命名 参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第七章_寄存器重命名 7.1 简述 7.2 寄存器重命名方式 7.2.1 用ROB进行 ...

  7. 超标量处理器设计——第十章_提交

    参考<超标量处理器>姚永斌著 文章目录 超标量处理器设计--第十章_提交 10.1 概述 10.2 重排序缓存 10.2.1 一般结构 10.2.2 端口需求 10.3 管理处理器的状态 ...

  8. 姚永平是STC南通国芯微电子/宏晶科技创始人,谈单片机设计

    姚永平是STC南通国芯微电子/宏晶科技创始人,他创造了中国IC设计公司的奇迹,他的8051单片机已经占领了全球市场的80%以上,并且他的市场优势还在不断扩大.他几乎不接受媒体采访,但不久前他向本站披露 ...

  9. 程序设计基础(c语言)实验与习题指导实验题答案杨永斌 丁明勇,程序设计基础(c语言)实验与习题指导实验题答案杨永斌 丁明勇...

    程序丙烯包薄膜衣用于脂可Ⅱ号酸树. 设计实验边坡稳定性越好. 基础度不由倾宜超土在土柱中自钢筋过3混凝混凝和墙落高.步通的串5等议有常用行异信协,必须的通议通信遵循相同信协双方,串口通信使用时.当系统 ...

  10. 基于TI SitaraAM335x ARM Cortex-A8处理器设计的评估板的拓展IO口和0ADC接口

    前言 创龙TL335x-EVM是一款基于TI Sitara系列AM3352/AM3354/AM3358/AM3359 ARM Cortex-A8高性能低功耗处理器设计的评估板,由核心板和底板组成.核心 ...

最新文章

  1. Python 进阶_闭包 装饰器
  2. 天翼云从业认证(4.12) 天翼云医疗行业解决方案
  3. Redis源代码分析之sds, 动态数组
  4. c语言源程序结构是怎样的?
  5. [渝粤教育] 西南科技大学 土木工程施工 在线考试复习资料(1)
  6. 非中国服务器的时区问题
  7. php 实现一致性哈希,PHP一致性哈希实现。。
  8. Java进程与子进程交互
  9. linux中lsattr命令,Linux命令(16)——chattr与lsattr命令
  10. 安装IIS以及配置ASP.NET流程
  11. AlexNet、VGG16、ResNet网络结构图
  12. android黑域系统文件,优雅地使用安卓手机,黑域免root使用教程
  13. C语言双向链表的实现
  14. lvm卷的缩减和扩容
  15. (含源码)麻雀搜索算法(SSA)的原理和matlab实现
  16. docker在centos7中run时遇到的坑?
  17. 两台路由器直连服务器需要怎么配置,设置串联两台无线路由器的方法步骤
  18. 网易云音乐小程序登录接口显示400,拥挤问题解决
  19. 这是一个秘密,是一个秘密
  20. oracle18c打开pdb服务,SQLPLUS 连接 Oracle 18c CDB和PDB方法

热门文章

  1. 新概念英语第一册1-144课(转)
  2. 鸿蒙汽车电动尾门工厂,汽车智能电动尾门为什么能成为汽车电子行业“新宠”?...
  3. libav的avplay修改支持sdl2.0
  4. Flash Cs4 安装之后打不开
  5. 1到20的阶乘和是多少 php,20的阶乘(1到20的阶乘和结果)
  6. linux超出频率限制黑屏,linux suse 超出频率限制 问题
  7. SLAM算法 - 3D激光匹配算法
  8. 外卖类应用的竞争与发展分析
  9. java sts安装步骤_java开发工具STS的下载及安装
  10. 基于matlab实现人脸识别解析