处理器(计组课程)

这篇具有很好参考价值的文章主要介绍了处理器(计组课程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、最原始的指令处理理解

31~26 25~21 20~16 15~11 --- 

处理器(计组课程)

 二、流水线

处理器(计组课程)

 处理器(计组课程)

三、冒险问题

1.解决数据冒险

(从流水线寄存器通过旁路传回数据 也叫作 转发

处理器(计组课程)

若产生冒险,则更前面的指令中 需要写入的目的寄存器刚好是 当前指令需要读取的源寄存器,此时对于当前源寄存器而言,这个寄存器内部的数据并不是准确的,因为它需要用到前一个指令产生的结果。此时可以用到旁路,解决这个问题。

观察指令可知:

        R型指令,需要用到rs,rt源寄存器,写入rd目的寄存器

        beq指令,需要用到rs,rt源寄存器,不需要写入

        sw指令,需要用到rs,rt源寄存器,不需要写入

        lw指令,需要用到rs源寄存器,写入rt目的寄存器

可知,beq和sw指令 不会对后面指令产生影响,因为它们仅仅使用该寄存器值,并不修改该寄存器值,后面指令访问该源寄存器的值依然是准确的。

会产生冒险的只有R型-X 或 lw-X

旁路能解决的是 R型-X  或者 Lw-X(X不用到lw的目的寄存器)-R型 

不能直接通过旁路而需要流水线阻塞的是 取数-使用型数据冒险

两种旁路,第一种答案可从EX/MEM中取得,第二种答案可从MEM/WB中取得。

情况

一个指令的两个源寄存器分别是上两个指令的目的寄存器。如:

add $s0,$t0,$t1

add $t1,$t2,$t0

add $s1,$s0,$t1

这时,当第三条add到ALU输入时,第二条已经ALU运算完了,结果在EX/MEM里可以取出,第一条已经到MEM/WB里,可以取出

一个指令的一个源寄存器是上两个指令的目的寄存器。如:

add $t1,$t0,$t1

add $t1,$t2,$t0

add $s1,$s0,$t1

这时第二条已经ALU运算完了,结果在EX/MEM里可以取出,第一条已经到MEM/WB里,可以取出,但是第三条需要的t1是最新的t1也就是第二条指令里面的t1,所以它需要从最新的EX/MEM中取出。阻断MEM/WB的。

一个指令的一个源寄存器是上一个指令的目的寄存器或者是上上一个指令的目的寄存器

旁路解决:在ALU输入处加选择门的选择端(多选器

必须为写入指令才会影响下面的指令才需要旁路,所以RegWrite=1

①EX/MEM转发条件:(即应当从EX/MEM流水线寄存器通过旁路得到结果)

(1)当上一条指令为写入时,写指令应当为1

EX/MEM.RegWrite= 1

(2)当上一条指令的目的寄存器与当前源寄存器相同时

ID/EX.RS(RT)=EX/MEM.Rd (这里的Rd一定为15~11的目的寄存器,因为对于lw指令的rt目的寄存器是没办法在这里进行旁路的,在这里进行旁路是无效的,如果这里的下一条指令的RS为lw的Rt时,实际上已经产生了阻塞(这在后面我们会知道),加入了空指令,也就是说这时的EX/MEM.Rd为空,也就是在EX/MEM阶段不可能要取的是lw的rt,如果要取那么产生阻塞,也是在MEM/WB中取,当且仅当这个EX/MEM.Rd是15~11的R型目的寄存器才有效,所以无论如何不会出现ID/EX.RS=lw.Rt 然后取出ALU运算后的的地址的问题。)

(3)当上一条指令的目的寄存器不是zero寄存器时

EX/MEM.Rd≠$zero(为什么上一条指令的目的寄存器不能为$zero?其实并不是$zero的值被修改了,实际上没被修改。上一条指令的ALU的计算结果放在了EX/MEM流水线寄存器组里面,这个时候的结果并没有传给$zero,而此时目的寄存器实实在在确实是$zero,也就是说,它会误认为现在EX/MEM流水线寄存器组里面的值 就是需要的结果值,也就是ID/EX.RS=EX/MEM.Rd成立,所以会把结果值拿出来,但实际上$zero还是那个zero。它只判断 目的寄存器是否为源寄存器,然后把流水线的值转发给ALU,这个流水线的值 实际上并不是目的寄存器的现有值。)

处理器(计组课程)

②MEM/WB转发条件:

(1)MEM/WB.RegWrite=1

(2)ID/EX.RS(RT)=MEM/WB.Rd(Rt)

(3)MEM/WB.Rd≠$zero

 处理器(计组课程)

处理器(计组课程)

处理器(计组课程)处理器(计组课程) 

处理器(计组课程)

2.取数-使用型数据冒险

处理器(计组课程)处理器(计组课程)

 

处理器(计组课程)

流水线阻塞:lw指令的目的寄存器rt,只有当它经过 数据存储器取出数据之后,才是正确的,也就是说,对于lw型指令,它如果能用到旁路,正确的数据也仅仅会在MEM/WB流水线寄存器组里面。如果有一条指令如下:

lw $t0,200($s0)

add $t1,$t0,$s1

lw指令的目的寄存器,刚好就是下一条指令的源寄存器,根据流水线的实现原理可知,当lw执行到取出数据存储器的值 放入MEX/WB流水线寄存器组中时,add指令不得不执行到EX/MEM了,也就是它已经算完了,这显然不正确。换个思路,当add指令到需要输入ALU计算时,lw才执行到MEM阶段,还未取出值,这显然是不行的。

所以此时不得不产生流水线阻塞。

产生气泡:由于指令在ID阶段译码成功,则在ID/EX流水线寄存器里就已经知道了,该条指令是什么指令,如果此时是一条lw指令,并且前一条在IF/ID指令的源寄存器用到了lw指令中的rt那么必然会阻塞,所以可以在这里判断。

判断什么?

IF(ID/EX.MemRead=1 and     //唯一的寄存器写入操作 lw

(ID/EX.Rt=IF/ID.Rs or ID/EX.Rt=IF/ID.Rt)   //rt 与 后一条的源寄存器重合

PS:这里仍然会有一点不必要的气泡,但是不必要的气泡一定是没错的,只是并不必要而已,比如 若连续出现了lw指令,且后一个lw不用到前一个lw写入的目的寄存器,且同时写入同一个寄存器,这样也会插入一个气泡,因为前后rt相同,但显然并不需要气泡。还有一个就是jump指令,jump指令的rs和rt无效,所以并不需要气泡。(不考虑)文章来源地址https://www.toymoban.com/news/detail-469926.html

到了这里,关于处理器(计组课程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • ARM处理器架构的Thumb指令集中关于IT指令的使用

    在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了 IT 指令,进一步增强了代码的紧凑性。 Thumb中有一个比较有意思的指令—— IT ,这条指令用于根据指定的条件来执行后面相继的四条指令。当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。

    2024年02月07日
    浏览(14)
  • 基于mips指令集的处理器设计与实现

    基于mips指令集的处理器设计与实现

    1.mips指令集格式 2.mips寄存器特点 1.ALU模块 2.General_Register模块(通用寄存器) 3.instruction_cache模块(指令cache) 4.program_counter模块(程序计数器) 5.control模块(控制译码) MIPS是(Microcomputer without interlocked pipeline stages)的缩写,含义是无互锁流水级微处理器。MIPS 是最早的,最成功的RISC处

    2024年02月06日
    浏览(10)
  • Tensorflow(libtensorflow)报指令集与处理器不兼容

    最近连续在多个项目上接收到Tensorflow与环境不兼容问题的报告。 在一个新部署或者升级的环境上,服务尝试启动; 正常执行过程中,服务加载模型,标准错误中输出一行错误信息后服务停止。 错误信息: tensorflow/core/platform/cpu_feature_guard.cc:36] The TensorFlow library was compiled to

    2024年02月04日
    浏览(11)
  • RISC-V处理器的设计与实现(一)—— 基本指令集

    RISC-V处理器的设计与实现(一)—— 基本指令集

    RISC-V处理器的设计与实现(一)—— 基本指令集_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现(二)—— CPU框架设计_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现(三)—— 上板验证_Patarw_Li的博客-CSDN博客 RISC-V处理器设计(四)—— Verilog 代码设计-CSDN博客  RISC-V处

    2024年02月05日
    浏览(11)
  • 『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]

    『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT]

    『模型部署』神经网络模型部署[运行时|指令执行|处理器架构|TensorRT] 辅助文档-本教程配套代码,以及更多范例和文档 :https://github.com/NVIDIA/trt-samples-for-hackathon-cn/tree/master/cookbook Polygraphy:深度学习推理原型设计和调试工具包 介绍个工具Torch.Profiler,使用它来确定你的性能瓶颈

    2024年02月11日
    浏览(33)
  • 【架构】探索计算机处理器的世界:ARM和x86架构解析及指令集

    计算机处理器是数字化时代的核心引擎,而在众多处理器架构中,ARM和x86是备受关注的三个。本文将带您深入探索这三个架构,介绍它们的特点、公司背景以及应用领域。让我们一起揭开计算机处理器的神秘面纱吧! ARM(Advanced RISC Machines)是一种计算机指令集架构(ISA),

    2024年02月11日
    浏览(12)
  • 深入理解图形处理器(GPU):加速人工智能和大数据计算的引擎

    深入理解图形处理器(GPU):加速人工智能和大数据计算的引擎

    前言: 图形处理器(GPU)不再仅仅是用于图形渲染的硬件设备。如今,GPU已经成为加速人工智能、大数据计算和科学研究的关键引擎。本文将深入探讨GPU的工作原理、应用领域以及它在当今技术领域中的重要性。 GPU(Graphics processing unit)是一种专门设计用于处理图形和图像

    2024年04月15日
    浏览(14)
  • Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

    目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果  三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列

    2024年02月16日
    浏览(14)
  • Jmeter前置处理器和后置处理器

    Jmeter前置处理器和后置处理器

    1. 后置处理器(Post Processor) 本质上是⼀种对sampler发出请求后接受到的响应数据进⾏处理 (后处理)的⽅法  正则表达式后置处理器 (1)引⽤名称:下⼀个请求要引⽤的参数名称,如填写title,则可⽤${title}引⽤它 (2)正则表达式: ():括起来的部分就是要提取的。 .:匹配

    2023年04月21日
    浏览(11)
  • DP读书:鲲鹏处理器 架构与编程(八)3.1鲲鹏处理器片上系统与Taishan处理器内核架构

    DP读书:鲲鹏处理器 架构与编程(八)3.1鲲鹏处理器片上系统与Taishan处理器内核架构

    处理器体系结构,是一个偏底层的内容,但这是任一计算机系统的底层。 系统的性能、生态和功能很大程度上都依赖于计算机系统底层——处理器体系结构。任何一个系统程序员、固件设计者、应用程序员 甚至 服务器管理员,如果想要充分利用现代高性能处理器的硬件性能

    2024年02月12日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包