结构冒险,控制冒险,数据冒险实例分析

news2024/11/18 13:32:47

目录

1.结构冒险:

2.数据冒险:

3.控制冒险:


 指令执行过程:

取指(IF):从指令存储器或 Cache 中取指令。
译码/读寄存器(ID):操作控制器对指令进行译码,同时从寄存器堆中取操作数。
执行/计算地址(EX):执行运算操作或计算地址。

访存(MEM):对存储器进行读/写操作。

写回(WB):将指令执行结果写回寄存器堆。

1.结构冒险:

由不同指令在同一时刻争用同一功能部件而形成的冲突,也称资源冲突,即由硬件资源竞争造成的冲突。

解决方法:

(1)前一指令访存时,使后一条相关指令及其后续指令暂停一个时钟周期。

例题:

指令和数据通常都存放在同一存储器中,在第4个时钟周期,第 i 条LOAD指令进入 MEM 段时,第i+3条指令的 IF 段也要访存取指令,此时会发生访存冲突。所以,在前一条指令访存时,暂停(一个时钟周期)取后一条指令的操作。

:如果第i条指令不是LOAD 指令,在 MEM 段不访存,也就不会发生访存冲突。

(2)设置多个独立的部件。例如,对于寄存器访问冲突,可将寄存器的读口和写口独立开来;对于访存冲突,单独设置数据存储器和指令存储器。在现代Cache机制中,L1级 Cache通常采用数据Cache和指令Cache 分离的方式,从而也就避免了资源冲突的发生。

2.数据冒险:

数据冒险也称数据相关。引起数据冒险的原因是,后面指令用到前面指令的结果时,前面指令的结果还没有产生。在以非乱序执行的流水线中,所有数据冒险都是由于前面指令写结果之前,后面指令就需要读取而造成的,这种数据冒险称写后读(Read After Write,RAW)冲突。

补充:与非乱序执行的流水线相对应的是超标量流水线,其指令可以不按顺序执行,即乱序执行,不熟悉的可以看看这篇:

指令流水线

例如:

解决方法:

(1)延迟执行相关指令。把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行,可分为软件插入空操作“nop”指令和硬件阻塞(stall)两种方法。

对于上面的"写后读"冲突,可以暂停sub指令3个时钟周期,直至前面 add 指令的结果生成。

当然也可以,取指操作先做:

对于I1和 I2的数据相关问题,还可以通过将寄存器的写口和读口分别控制在前、后半个时钟周期内操作,使前半周期写入R1的值在后半周期马上被读出,在一个周期内读/写寄在器不会生冲突,这样I1的 WB段和I2 的ID段就可重叠执行,从而只需延迟2个时钟周期。

(2)设置相关转发通路,不等前一条指令把计算结果写回寄存器,下一条指令也不再从寄存器读。而将数据通路中生成的中间数据直接转发到 ALU 的输入端,也就是直接从EX/MEM流水寄存器中取操作数到ALU输入端进行运算。所以下图所示,add的“EX”操作后,紧接为sub的"EX"操作。

但是load指令与其后的运算类指令存在数据相关问题,则无法通过转发技术来解决。

例如:

I2         load r2,12(r1)        #M[ (r1)+I2]--->(r2)

I3         add r4 r3,r2           #(r3)+(r2)--->(r4)

load 指令只有在 MEM 段结束时才能得到主存中的结果,然后送 MEM/WB 流水段寄存器,在 WB 段的前半周期才能存入R2的新值,但随后的 add 指令在 EX 阶段就要取 R2 的值,因此,得到的是旧值。(这里假设用了转发技术)

对于 load-use 数据冒险,最简单的做法是由编译器在add指令之前插入一条 nop指令,这样在 add 指令的 EX 段就可以从 MEM/WB 流水段寄存器中取出 load 指令的最新结果,当然,最好的办法还是在程序编译时进行优化,通过调整指令顺序以避免出现load-use观象。

例题1:

下列指令序列中,指令 I1 和 I3、I2 和 I3 之间发生数据相关。假定采用“取指、译码、取数、执行、访存,写回”五段流水线方式,那么在采用转发技术时,需要在指令I3之前加入( )条空操作指令才能使这段程序不发生数据冒险。

I1: add r1,r0, 1        #(r1)<--- (r0)+ 1

I2: load r3,12(r2)        #(r3)<--- M[(r2) + 12]

I3: add r5,r3,r1        # (r5)<--- (r3)+(r1)

A. 3        B.2        C.0        D.1

答案:D

不发生任何流水线阻塞的执行顺序如下:

由于采用了转发技术,所以I3只要在I1的"EX"后执行取数操作即可,因为转发技术就是直接从EX/MEM流水段寄存器取值。所以 I3 与 I1 之间解决了“数据冒险”。

load 指令只在MEM段结束时才能取到主存中的数据,然后送MEM/WB 流水段寄存器,在WB段的前半周期才能将新值写入r3,但随后的add指令在EX阶段就要取r3的值了,因此会发生数据冒险。

在add前插入一条空操作指令就行:

例题2:

在采用“取指、译码/取数、执行、访存、写回”5段流水线的处理器中,执行如下指令序列,其中 s0、s1、s2、s3 和t2表示寄存器编号。

I1:add s2,s1,s0        //R[s2]<---R[s1]+R[s0]

I2:load s3,0(t2)        //R[s3]<---M[ R[t2]+0 ]

I3:add s2,s2,s3        //R[s2]<---R[s2]+R[s3]

I4:store s2,0(t2)       //M[R[t2]+0]<---R[s2]

下列指令对中,不存在数据冒险的是()。

A.I1和I3        B.I2和I3        C.I2和I4        D.I3和I4

答案:C

注:这里没有用到转发技术

对于A,B:

I3 的add指令要取 I1 的s2和 I2 的s3,需要等到两者的WB(写回)都结束才可以取操作数(ID),所以会发生“写后读”冲突。

 对于D:

I4的store指令要用到I3的结果s2,所以只有在 I3 的WB(写回)后,才可以取操作数。

3.控制冒险:

指令通常是顺序执行的,但当遇到改变指令执行顺序的情况,例如执行转移或返回指令、发生中断或异常时,会改变PC值,从而造成断流,也称控制冲突。

解决方法:

(1)对于由转移指令引起的冲突,可采用和解决数据冲突相同的软件插入“nop”指令和硬件阻塞(stall)的方法。通常把因流水线阻塞带来的延迟时钟周期数称为延迟损失时间片(C)

I1        loop:add Rl,R1,1        #(R1)+1→R1

I2        bne Rl,R2,loop          #if(R1)!=(R2) goto loop

假设R2存放常数N,R1的初值为1,bne 指令在 EX 段通过计算设置条件码,并在 MEM 段确定是否将PC 值更新为转移目的地址,因此仅当bne指令执行到第5个时钟结束时才能将转移目标地址送PC。为此,在数据通路检测到分支指令后,可以在分支指令后插入C(C=3)条nop指令。

(2)对转移指令进行分支预测,尽早生成转移目标地址。分支预测分为简单(静态)预测和动态预测。

① 静态预测假定分支总是不发生或者总是发生,每次预测结果是一样的。若静态预测的条件总是不满足,则按序继续执行分支指令的后续指令。

② 动态预测根据程序转移的历史情况,进行动态预测调整,根据局部性原理,其预测成功率通常比静态预测技术高。预测错误时,已被错误放入流水线执行的指令必须被舍弃。

例题:

在采用“取指、译码/取数、执行、访存、写回”5 段流水线的 RISC处理器中,执行如下指令序列(第一列为指令序号),其中s0、s1、s2、s3 和t2表示寄存器编号。

若采用转发(旁路)技术处理数据冒险,采用硬件阻塞方式处理控制冒险,则在指令I1~I4的执行过程中,发生流水线阻塞的指令有()

A. 仅I3        B.仅I2、I4        C仅I3、I4        D、仅I2、I3、I4

答案:C

① I2 和 I1 之间存在数据冒险,但是I1在EX段结束时就已生成R[s2]的新值,并存放在EX/MEM 流水段寄存器中,采用转发技术后,可直接从该寄存器中取出数据送到 ALU 的输入端,这样 I2 执行时 ALU用的是 R[s2] 的新值,解决了I2和 I1 之间的数据冒险。

② I3 和 I2 之间存在数据冒险,属于 load-use 数据冒险,用转发电路无法解决 I3 和 12 的数据相关问题,原因在于 load指令 是从内存中取数,只有在 Mem 段结束时才能从主存中得到R[s3]的新值,但3的 EX 段就要用到R[s3],因此无法用转发技术解决。I3 仍需阻塞一个时钟周期,等到12的 Mem 段结束后,从I2的 Mem/WB流水段寄存器中取到 R[s3]的新值。

③ I4和I3之间存在控制冒险,beq 指令在 Ex段设置条件码,在Mem 段控制是否将转移地址送到PC,这之后才能开始根据PC内容取指令,因此I4需要进行硬件阻塞。

总结:

1.结构冒险:

load指令MEM段的访存与后面指令的IF取指(取指访存)冲突,后面指令暂停一个时钟周期。

2.数据冒险:

① 后面指令需等前面指令写回才能进行译码(ID)

② 如果用了转发技术,则可以从EX/MEM流水段寄存器取值到ALU输入端,从而解决数据冒险

③ 对于load-use数据冒险,需要等待前一条指令的"MEM"结束后,后面指令的“EX”才能到MEM/WB流水段寄存器取值

3.控制冒险:

取指操作中,转移指令的下一条指令,需要在转移指令的"MEM"之后,才能进行取指(IF)操作。因为只有在MEM段才能确定,是将转移目标地址(满足转移条件)送入PC,根据PC内容取指令。还是取"PC+1"的指令(不满足转移条件)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1867635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文字实录|Checkout.com大中华区总经理项尧:品牌全球化发展中的支付运营策略

大家好&#xff0c;很高兴在此次【品牌全球化营销增长峰会】与大家一起分享和交流。 我叫项尧&#xff0c;是 Checkout.com 大中华区的总经理&#xff0c;在支付领域有将近15年的经验。 我们 Checkout.com 是一家总部位于英国的支付公司&#xff0c;专注于线上收单&#xff0…

深入理解组合模式(Composite Pattern)及其实际应用

引言 在软件开发中&#xff0c;我们经常会遇到树形结构的数据&#xff0c;这种结构包含了简单和复杂的对象。组合模式&#xff08;Composite Pattern&#xff09;通过将对象组织成树形结构来表示部分和整体的层次关系&#xff0c;使得客户端对单个对象和组合对象的使用具有一致…

OpenCV 张氏标定法

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 “张正友标定法”是由张正友教授于1998年提出的单平面棋盘格的摄像头标定方法,该方法介于传统标定法和自标定法之间,克服了传统标定法需要高精度标定物的缺点,仅需要一个棋盘格即可。作为一种非常经典的相机内参标定…

Redis发布、订阅模式(Pub/Sub)详解

Redis发布、订阅模式&#xff08;PUB-SUB&#xff09;详解 Redis的发布订阅&#xff08;Pub/Sub&#xff09;机制是一种消息通信模式&#xff0c;用于消息的广播。它允许多个客户端订阅&#xff08;Subscribe&#xff09;特定的频道&#xff08;Channel&#xff09;&#xff0c…

机器人控制系列教程之动力学建模(2)

接昨天的推文&#xff1a;https://editor.csdn.net/md/?articleId139991958 &#xff0c;动力学的求解通常是个相对比较复杂的过程&#xff0c;但现在基本上不用人工来推算求解各种公式和求解过程了&#xff0c;大家只需要知道其中的步骤即可&#xff0c;现代对于动力学问题的…

51单片机STC8H8K64U通过RA8889/RA8876如何控制彩屏(源码下载)

【硬件部份】 一、硬件连接实物&#xff1a; STC8H系列单片机不需要外部晶振和外部复位&#xff0c;在相同的工作频率下&#xff0c;速度比传统的8051单片机要快12倍&#xff0c;具有高可靠抗干扰的优秀特性&#xff0c;与瑞佑的RA8889/RA8876控制芯片刚好可以完美搭配用于工…

java易错题型(复习必看)

java易错题型&#xff1a; 下列符号中&#xff0c;哪个用于分隔throws关键字抛出的多个异常 逗号&#xff0c; Java中用来声明一个方法可能抛出某种异常的关键字是throw 对于catch子句的排列&#xff0c;下列哪种是正确的&#xff1a;子类异常在先&#xff0c;父类异常在后&a…

鸿蒙NEXT开发知识:工具常用命令—ohpm config

设置ohpm用户级配置项。 命令格式 ohpm config set <key> <value> ohpm config get <key> ohpm config delete <key> ohpm config list 说明 配置文件中信息以键值对<key> <value>形式存在。 功能描述 ohpm 从命令行和 .ohpmrc 文件中…

Android SurfaceFlinger——动画进程销毁(十七)

在动画播放完成后&#xff0c;对动画相关资源释放的同时还需要销毁动画进程。这里我们就来分析一下动画进程的销毁流程。 一、动画进程销毁 动画进程的销毁一般是在桌面进程准备显示的时候&#xff0c;而桌面准备显示是在桌面 Activity 的 Resume 生命周期&#xff0c;我们来看…

江科大—读写内部闪存FLASH读取芯片ID

读写内部闪存FLASH 右下角是OLED&#xff0c;然后左上角在PB1和PB11两个引脚&#xff0c;插上两个按键用于控制。下一个代码读取芯片ID&#xff0c;这个也是接上一个OLED&#xff0c;能显示测试数据就可以了。 STM32-STLINK Utility 本节的代码调试&#xff0c;使用辅助软件…

Sparse4Dv2

Sparse4D: Multi-view 3D Object Detection with Sparse Spatial-Temporal Fusion 相关内容&#xff1a;总览&#xff0c;Sparse4D v1&#xff0c;Sparse4D v3&#xff0c; 单位&#xff1a;地平线(Sparse4D v1 原班人马) GitHub&#xff1a;https://github.com/HorizonRobo…

计算机网络之数据通信原理(中)

上节内容传送口&#xff1a;数据通信原理基础 1.数据传输方式 1.1并行传输 并行传输: 字符编码的各个比特同时传输 特点&#xff1a; 一个比特时间内可传输一个字符&#xff0c;传输速度快&#xff0c;每个比特传输要求一个单独的信道支持&#xff0c;通信成本高&#xf…

基于单片机和 Arduino 平台的六自由度可控机械手臂

摘 要 : 为了降低机械手臂的设计开发难度 &#xff0c; 并使之尽早地投入应用 &#xff0c; 设计一种基于单片机和 Arduino 平台的六自由度可控机械手臂 。提出六自由度可控机械手臂的控制方案&#xff0c; 给出机械手臂控制系统的结构框图 。 详细设计六自由度可控机械手臂…

《UDS协议从入门到精通》系列——图解0x35:请求上传

《UDS协议从入门到精通》系列——图解0x35&#xff1a;请求上传 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 三、通信示例 Tip&#x1f4cc;&#xff1a;本文描述中但凡涉及到其他UDS服务的&#xff0c;将陆续提供链接跳转方式以便快…

Power BI可视化表格矩阵如何保持样式导出数据?

故事背景&#xff1a; 有朋友留言询问&#xff1a;自己从Power BI可视化矩阵表格中导出数据时&#xff0c;导出的表格样式会发生改变&#xff0c;需要线下再手动调整&#xff0c;重新进行透视组合成自己想要的格式。 有没有什么办法让表格导出来跟可视化一样&#xff1f; Po…

pd虚拟机 Parallels Desktop 19 for Mac 破解版小白安装使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

编译正则表达式模式re.compile

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 编译正则表达式模式 re.compile [太阳]选择题 根据给定的Python代码&#xff0c;哪个选项是正确的&#xff1f; import re pattern re.compile(r\d) print(f"【显示】pattern{patter…

eBPF 如何塑造 Linux 和平台工程的未来

当Docker 于 2013 年突然出现时&#xff0c;Linux 容器似乎一夜成名。但容器&#xff08;以及微服务和Kubernetes&#xff09;的演变实际上是基于 Linux 操作系统中的内核原语而进行的&#xff0c;历时数十年。 Docker 使用这些原语&#xff08;即 cgroups 和命名空间&#xf…

前端框架中的前端安全性(Front-end Security)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介前端框架中的前端安全性&#xff08;Front-end Security&#xff09;1. 引言2. 常见的前端安全威胁2.1 跨站脚本攻击&#xff08;XSS&#xff09;2.1.1 防御措施 2.2 跨站请求伪造&#xff08;CSRF&#xff09;2.2.1 防御措施 2.3 …

YOLOv8改进 | 添加注意力篇 | 结合Mamba注意力机制MLLA助力YOLOv8有效涨点(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是结合号称超越Transformer架构的Mamba架构的最新注意力机制MLLA&#xff0c;本文将其和我们YOLOv8进行结合&#xff0c;MLLA&#xff08;Mamba-Like Linear Attention&#xff09;的原理是通过将Mamba模型的一些核心设计融入线性注意力…