超标量处理器设计 姚永斌 前言 摘录

超标量处理器设计 姚永斌 前言 摘录目前的通用处理器从指令集方面可分为 RISC 和 CISC CISC 伴随着处理器的诞生 最开始的处理器都是使用这种指令集 力求在一条指令内完成很多事情 并且使用尽可能多的指令 覆盖到各种各样的操作 这就可以降低对存储器的需求 并且简化编译器的设计 当存储器和编译器不在是问题时 RISC 产生了 因为 80 的 CISC 指令只在 20 被使用 则可以将经常使用的 20 的 CISC 指令使用硬件来实现 剩余 80 的指令可以使用软件来模拟 于是简化硬件的设计 也便于使用流水线 不像可以变化长度的 CISC 指令 RISC 指令采

目前的通用处理器从指令集方面可分为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处理器。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233627.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月4日 上午9:01
下一篇 2025年7月4日 上午9:22


相关推荐

  • 一文看懂Web后端开发「建议收藏」

    一文看懂Web后端开发「建议收藏」一文看懂Web后端开发前言由于网络上系统地介绍后端开发的文章实在太少,而最近有恰巧有许多同学问我“什么是后端开发?”、“你为什么喜欢后端开发?”、“做后端都需要学什么?”,那么我们就来讲一讲,到底什么才是后端开发。定义后端开发(Back-EndDevelopment,也称服务端开发、服务器端开发等)是创建完整可运行的Web应用服务端程序(服务端程序和资源合称为后端,即在服务器上运行的、不涉及用户界面的部分)的过程,是Web应用程序开发的一部分。后端开发者使用Java、Golang等语言及其衍生的各

    2022年6月29日
    27
  • SVPWM算法理解(一)——基本原理

    SVPWM算法理解(一)——基本原理SVPWM 详解 1 为什么要使用 SVPWM 1 1 引言 1 2SVPWM 基本原理 2SVPWM 合成原理 1 为什么要使用 SVPWM 1 1 引言 在讲解 SVPWM 之前 我们首先对 PMSM 的结构简单剖析一下 一般的三相两极永磁同步电机的物理模型可以简化如图 1 1 可以看出 PMSM 的转子是永磁体 三相定子对称分布 它们在空间上互差 120 采用的是 Y 型接法 这也就构成了 PMSM 的三相静止坐标系 ABC PMSM 的工作原理其实很简单 在定子中产生一个大小恒定的旋转磁场带动转子连续旋转 再简单点说 PMS

    2026年3月19日
    2
  • Plants Vs Zombies Online_vascular plant

    Plants Vs Zombies Online_vascular plant24 83 2 6 63 910 10 164题解贪心+二分#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5 + 10;ll a[N],st[N]; int n,m;bool check(ll x){ memset(st,0,sizeof st); ll cnt = 0; for(int i = 1;i <= ..

    2022年8月8日
    8
  • Linux常用命令:chmod修改文件权限 777和754

    Linux常用命令:chmod修改文件权限 777和754常用下面这条命令:chmod777 文件或目录示例:chmod 777/etc/squid运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行)。如果是Ubuntu系统,可能需要加上sudo来执行:sudochmod 777/etc/squid故事的开始,都会先留一个悬念。只有程序员能懂的冷笑话系列中,有个比较经典的段子:请用最简洁的语言描述我国FL。754。…

    2022年7月27日
    11
  • C中sealed的用法

    C中sealed的用法1 sealed 关键字 nbsp nbsp nbsp 当对一个类应用 sealed 修饰符时 此修饰符会阻止其他类从该类继承 类似于 Java 中 final 关键字 nbsp nbsp nbsp 在下面的示例中 类 B 可以继承类 A 但是任何类都不能继承类 BclassA sealedclassB A nbsp 2 sealed 修饰方法或属性 nbsp nbsp nbsp 可以允许类从基类继承 并防止它们重写特定的虚方法或虚属性 nbsp nbsp nbsp

    2026年3月17日
    2
  • 相机技术–摄像头传感器的感光区尺寸规格

    相机技术–摄像头传感器的感光区尺寸规格摄像头传感器的尺寸,一般主要是指对角线的尺寸,先上图,这个东西现在已经完全是历史遗留产物,据说这个尺寸的术语来自古老的Vidicon真空管(vacuumtubes)图像传送传感器;名称与具体尺寸关系其实不是很密切,大部分都维护了4:3(Horizontal:Vertical)宽高比。参考:ImagingElectronics101:UnderstandingCameraSensorsforMachineVisionApplications…

    2022年5月8日
    99

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号