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

目录

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.mzph.cn/news/861525.shtml

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

相关文章

黑鹰优化算法(BEO)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、种群初始化 二、围捕行为 三…

centos上快速搭建zfile文件网站

什么是zfile&#xff1f; zfile文件网站是最方便快捷的在线目录展示程序&#xff0c;支持将本地文件、FTP、SFTP、S3、OneDrive 等存储在网站上展示并浏览&#xff01; 本教程参考&#xff1a; https://docs.zfile.vip/install/os-linux复现 今天的搭建环境是centos7.9 第一…

Spring Boot 整合 JSP

Spring Boot 是一个开源的 Java 框架&#xff0c;用于创建独立、生产级的基于 Spring 框架的应用程序。它简化了基于 Spring 的应用程序的创建和部署过程。JSP&#xff08;JavaServer Pages&#xff09;是一种动态网页技术&#xff0c;允许开发者在 HTML 中嵌入 Java 代码。将 …

CSS|03 尺寸样式属性文本与字体属性

尺寸样式属性 height:元素高度height的值&#xff1a;auto 自动length 使用px定义高度% 基于包含它的块级对象的百分比高度 width&#xff1a;元素的宽度width的值与height一样span标签可以设置宽度、高度吗&#xff1f; 答&#xff1a;不可以&#xff0c;因为span标签是一个行…

A-8 项目开源 qt1.0

A-8 2024/6/26 项目开源 由于大家有相关的需求&#xff0c;就创建一个项目来放置相关的代码和项目 欢迎交流&#xff0c;QQ&#xff1a;963385291 介绍 利用opencascade和vulkanscene实现stp模型的查看器打算公布好几个版本的代码放在不同的分支下&#xff0c;用qt实现&am…

科技赋能·创领未来丨智合同和百胜中国就Contract AI Studio项目达成合作

#智合同 #百胜中国 #AIGC #NLP #LLM #Contract AI Studio 近期&#xff0c;国内AIGC和LLM大语言模型发展可谓是如火如荼&#xff0c;其迅速崛起为社会和产业发展起到了非常重要的作用。人们利用AI技术&#xff08;AIGC、LLM大语言模型、NLP等&#xff09;将其赋能到企业生…

华为仓颉编程语言

目录 一、引言 二、仓颉编程语言概述 三、技术特征 四、应用场景 五、社区支持 六、结论与展望 一、引言 随着信息技术的快速发展&#xff0c;编程语言作为软件开发的核心工具&#xff0c;其重要性日益凸显。近年来&#xff0c;华为公司投入大量研发资源&#xff0c;成功…

记录待办事项的便签软件哪个好用?

在快节奏的现代生活中&#xff0c;我们经常需要处理各种各样的待办事项&#xff0c;为了更好地管理时间&#xff0c;许多人选择使用便签软件来记录自己的待办事项。那么&#xff0c;记录待办事项的便签软件哪个好用&#xff1f;市面上众多的便签软件中&#xff0c;哪一个才是最…

【C++题解】1715. 输出满足条件的整数5

问题&#xff1a;1715. 输出满足条件的整数5 类型&#xff1a;简单循环 题目描述&#xff1a; 有这样一个四位数,其千位和百位之和为偶数&#xff0c;十位和个位之和为奇数&#xff0c;且前两位之和大于后两位之和&#xff0c;且含有因数 8 &#xff0c;请输出满足上述条件的…

49-3 内网渗透 - MSI安 装策略提权

靶场环境搭建: 这里还是用我们之前的windows2012虚拟机进行搭建 1)打开一些设置让靶场存在漏洞 打开组策略编辑器(gpedit.msc) 使用运行命令打开: 按下 Win + R 组合键来打开运行对话框。输入 gpedit.msc,然后按下 Enter 键。使用搜索打开: 点击任务栏上的搜索框(W…

【Docker】安装和加速

目录 1.安装 2.了解 docker 信息 3.查询状态 4. 重新启动Docker 1.安装 yum install –y docker 2.了解 docker 信息 cat /etc/redhat-release 3.查询状态 systemctl status docker 4.支持 1.12 的 docker 镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docke…

Unity之Hololens2开发MRTK Profile详解

前言 配置 MRTK 的主要方式之一是使用基础包中的配置文件。 场景中的主要 MixedRealityToolkit 对象具有活动配置文件 - 一个 ScriptableObject。 顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。 此外,这些…

RK3568平台(音频篇)RT5651解码芯片Codec驱动分析

一.Audio Codec的必要性 在理想状况下&#xff0c;对于录音过程&#xff0c;只需要将麦克风获取到的analog信号通过ADC转换为digital信号并存储即可&#xff0c;对于播放音过程&#xff0c;只需要将digital信号通过DAC转换为analog并输出到speaker播放即可。 但在实际的过程中…

【学习】如何利用Python技术进行软件测试相关工作

Python是一种广泛使用的高级编程语言&#xff0c;它因其简洁的语法、强大的库支持和跨平台特性而受到开发者的喜爱。在软件测试领域&#xff0c;Python同样发挥着重要作用&#xff0c;它可以帮助测试人员编写自动化测试脚本、进行接口测试、性能测试、以及处理测试数据等。以下…

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…

华为开发者调试工具使用介绍(MDC)

MDC的开发过程的三大工具&#xff1a;MMC、MDS、Mind Studio&#xff0c;这三个工具完成了开发过程中的配置文件编写、代码编写以及AI模型的开发三个任务。除了开发&#xff0c;MDC还准备了两个调试工具&#xff0c;用于使用过程中数据的查看等。这一些调试工具分别对映射MDC中…

单目标应用:基于鳗鱼和石斑鱼优化器(Eel and grouper optimizer,EGO)的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、鳗鱼和石斑鱼优化器求解微电网 2.1算法简介 鳗鱼和石斑鱼优化器&…

MySQL简介:开源数据库的基石(一)

目录 引言&#xff1a;数据库领域的革新者 一、MySQL的发展历程&#xff1a;从开源先锋到行业领袖 二、MySQL的核心特性&#xff1a;性能、安全与灵活性并重 三、MySQL的应用场景&#xff1a;从Web开发到企业级应用的全面覆盖 四、MySQL在开源数据库中的地位&#xff1a;开…

Excel直接打开csv文件后,数据不能正常显示的解决方法

很多处理公司数据的同事偶尔也会遇到使用Microsoft的Excel或者金山的WPS打开csv文件后&#xff0c;发现数据不能正常显示&#xff0c;其实csv属于一种数据库文件&#xff0c;遵循数据库存储的规则&#xff0c;建议使用导入的方式进行打开。 1.打开一张空白的Excel表&#xff0…

Spring Boot 集成 H2 数据库

1. 引言 Spring Boot 以其简洁的配置和快速开发能力&#xff0c;成为现代微服务架构的首选框架之一。而H2数据库作为一个轻量级的内存数据库&#xff0c;非常适合开发阶段作为嵌入式数据库进行单元测试和功能验证。本文将手把手教你如何在Spring Boot项目中集成H2数据库&#…