【计算机系统结构实验】实验2 流水线中的冲突实验
2.1 实验目的
加深对计算机流水线基本概念的理解;
理解MIPS结构如何用5段流水线来实现,理解各段的功能和基本操作;
加深对结构冲突/数据冲突/控制冲突的理解;
进一步理解解决数据冲突的方法,掌握如何应用定向技术来减少数据冲突引起的停顿,并加深对指令调度技术和延迟分支技术的理解;
2.2 实验平台
实验平台采用指令级和流水线操作级模拟器MIPSsim。
2.3 实验内容
阅读理解课件第3章的“3.4节 流水线的相关与冲突”(97屏-127屏)。
1)启动MIPSsim,选择“配置->流水方式”选项,使模拟器工作在流水方式下。
2)观察分析结构冲突对CPU性能的影响:
加载样例程序structure_hz.s,执行该程序(用连续执行方式)。分析结构冲突的原因,记录结构冲突引起的停顿时钟周期数。(注:模拟器中浮点加法执行段时间默认6个周期)
把浮点加法器的个数改为6个(配置->常规配置->浮点加法器个数 改为6),再重复上一步的工作。总结解决结构冲突的方法。
结构冲突:在流水线处理机中,某种指令组合因为资源冲突而不能正常执行。
导致此结构冲突的原因:资源份数不够。
在该流水线中,只有一个加法器,导致下一条指令在第三周期执行加法操作时,加法器被第一条加法指令占用,此时只能等待第一条指令加法操作执行完毕让出加法器。
可见结构冲突引起的停顿时钟周期数为35。
而当我们将浮点加法器的个数改为6个时,再次执行程序。
可见结构冲突引起的停顿时钟周期数为0,成功解决了结构冲突问题。
3)观察数据冲突并用定向技术来减少停顿:
数据冲突:当相关的指令彼此靠得足够近时,它们在流水线中的重叠执行或者重新排序会改变指令读/写操作数的顺序,使之不同于它们串行执行时的顺序,则发生了数据冲突。
(a)
全部复位,加载data_hz.s,关闭定向功能(“配置->定向”无对勾),单步执行该程序,查看时钟周期图,记录分析在什么时刻发生了RAW(写后读)冲突(只需运行到第一条分支指令BGTZ $r4, loop执行完)。记录数据冲突引起的停顿时钟周期数(可在统计窗口查看到)。
1.
因为指令LW在第三个周期需要读取r2寄存器中的数据,而第一条指令ADDIU在第四周期才会进行到写回周期WB,在第四周期前半将相加后的结果写入r2之中,所以LW指令需要等到第四周期才能执行指令译码/读寄存器周期ID,在第四周期后半读r2寄存器中的数据。
2-3.
因为指令ADD在第五个周期需要读r1寄存器中的数据,而指令LW在第七周期才会进行到写回周期WB,在第七周期前半将值写入r1之中,所以ADD指令需要等到第七周期才能执行指令译码/读寄存器周期ID,在第七周期后半读r1寄存器中的数据。
4-5.
因为指令SW在第八个周期需要读r1寄存器中的数据,而指令ADD在第十周期才会进行到写回周期WB,在第十周期前半将值写入r1之中,所以SW指令需要等到第十周期才能执行指令译码/读寄存器周期ID,在第十周期后半读r1寄存器中的数据。
6-7.
因为指令ADDI在第十二个周期需要读r5寄存器中的数据,而指令LW在第十四周期才会进行到写回周期WB,在第十四周期前半将值写入r5之中,所以ADDI指令需要等到第十四周期才能执行指令译码/读寄存器周期ID,在第十四周期后半读r5寄存器中的数据。
8-9.
因为指令SUB在第十六个周期需要读r3、r2寄存器中的数据,而指令ADDI在第十八周期才会进行到写回周期WB,在第十八周期前半将值写入r2之中,所以SUB指令需要等到第十八周期才能执行指令译码/读寄存器周期ID,在第十八周期后半读r2寄存器中的数据。
10-11.
因为指令BGTZ在第十九个周期需要读r4寄存器中的数据,而指令SUB在第二十一周期才会进行到写回周期WB,在第二十一周期前半将值写入r4之中,所以BGTZ指令需要等到第二十一周期才能执行指令译码/读寄存器周期ID,在第二十一周期后半读r4寄存器中的数据。
12.
同2-3.
总结
可以看到,RAW停顿在第0-24周期之间一共发生了12次。
(b)
打开定向功能,单步执行,查看时钟周期图,分析定向功能使用后减少了多少数据停顿,分析每一处定向为何要如此实现,并分析在什么时刻还有RAW停顿未消除,原因是什么(只需运行到第一条分支指令BGTZ $r4, loop执行完)。
原1.
指令LW在第三个周期需要读取r2寄存器中的数据,而第一条指令ADDIU在第三周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值将会被送至LW指令的ALU的入口处,减少了停顿的发生。
原2-3.(1.-load停顿)
因为指令ADD在第四个周期需要读r1、r3寄存器中的数据,而指令LW在第五周期访存周期MEM才会得到r1中的结果,所以ADD指令需要等到第五周期才能执行指令译码周期ID。
可以看到,指令LW在第五周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值将会被送至ADD指令的ALU的入口处,减少了停顿的发生。
原4-5.
指令SW需要将寄存器r1中的数值存入存储器中,指令ADD在第七周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至SW指令的MEM段的入口处,减少了停顿的发生。
另外,LW指令需要从寄存器r1中取出数值,指令ADD在第七周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值也会被直接送至LW指令的EX段的入口处,减少了停顿的发生。
原6-7.(2.-load停顿)
指令ADDI需要取出r5中的值,指令LW在第九周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至ADDI指令的EX段的入口处,所以ADDI指令需要等待一个周期。
原8-9.
指令SUB需要取出r3、r2中的值,指令ADDI在第十一周期EX段执行完之后,EX段和MEM段之间的流水寄存器中保存的数值将会被直接送至SUB指令的EX段的入口处,减少了停顿的发生。
原10-11.(3.)
指令BGTZ需要取出r4中的值,并将其与0作比较,指令SUB在EX段执行完之后,EX段和MEM段之间的流水寄存器中保存的数值将会被直接送至BGTZ指令的ID段的入口处,所以BGTZ指令需要等待一个周期。
总结
可以看到,定向功能减少了9次数据停顿,一共发生了三次RAW停顿,其中有两次为load停顿。
- 用指令调度技术解决流水线中的数据冲突:
全部复位,在MIPSsim中载入schedule.s样例程序。
(a)
打开定向功能,执行该程序(用连续执行方式),分析哪几个地方还有数据冲突(停顿),记录程序执行的总时钟周期数。
连续执行之后可以看到,一共发生了三次RAW停顿。
1.
指令ADD需要取出r0、r2中的值,指令LW在第四周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至ADD指令的EX段的入口处,所以ADD指令需要等待一个周期。
2.
指令ADD需要取出r6、r1中的值,指令LW在第八周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至ADD指令的EX段的入口处,所以ADD指令需要等待一个周期。
3.
指令MUL需要取出r20、r14中的值,指令LW在第十五周期MEM段执行完之后,MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至MUL指令的EX段的入口处,所以MUL指令需要等待一个周期。
总结
程序执行的总时钟周期数为20。
(b)
自己采用调度技术对schedule.s程序进行指令调度(自己修改源程序),完全消除数据冲突。将调度(修改)后的程序重新命名为afer-schedule.s。
afer-schedule.s:
.text
main:
ADDIU $r1,$r0,A
LW $r2,0($r1)
SW $r4,0($r1)
ADD $r4,$r0,$r2
LW $r6,4($r1)
MUL $r12,$r10,$r1
ADD $r8,$r6,$r1
ADD $r16,$r12,$r1
ADD $r18,$r16,$r1
SW $r18,16($r1)
LW $r20,8($r1)
MUL $r24,$r26,$r14
MUL $r22,$r20,$r14
TEQ $r0,$r0
.data
A:
.word 4,6,8
(c)
CPU复位,载入afer-schedule.s,执行该程序,记录程序执行的总时钟周期数。
指令调度前:
指令调度后:
连续执行,可见已完全消除数据冲突,时钟周期数为17,相比指令调度前执行周期总数少了3。
总结
指令调度可以通过在编译时让编译器重新组织指令顺序来消除冲突。仅改变了指令执行的顺序,使得本来需要等待的指令后执行,在不影响整体程序的执行结果的同时让无需等待的指令先执行,使得后执行的指令无需等待,达到了减少数据冲突的目的,使指令的平均执行周期减少了,性能因此而提高了。
5) 用延迟分支技术(延迟槽)减少分支指令对性能的影响:
(a)
全部复位,在MIPSsim中载入branch.s样例程序,关闭延迟槽功能,执行该程序(用连续执行方式),记录发生分支延迟的时刻,记录该程序执行的总时钟周期数。
连续执行之后可以看到,一共有两条分支指令,其中分支成功1条,分支失败一条。共发生两个周期的控制冲突。执行周期总数为38。
1.
一旦流水线的译码段ID检测到分支指令(第17周期),就暂停其后的所有指令的执行,直到确定是否成功并计算出新的PC值,然后按照新的PC值取指(第18周期)。
2.
一旦流水线的译码段ID检测到分支指令(第32周期),就暂停其后的所有指令的执行,直到确定是否成功并计算出新的PC值,然后按照新的PC值取指(第33周期)。
(b)
对branch.s程序进行指令调度(自己修改源程序,使用从前调度法),将调度后的程序重新命名为delayed-branch.s。(注:模拟器中延迟槽默认为1个)。
delayed-branch.s:
.text
main:
ADDI $r2,$r0,1024
ADD $r3,$r0,$r0
ADDI $r4,$r0,8
loop:
LW $r1,0($r2)
ADDI $r3,$r3,4
ADDI $r1,$r1,1
SUB $r5,$r4,$r3
BGTZ $r5,loop
SW $r1,0($r2)
ADD $r7,$r0,$r6
TEQ $r0,$r0
(c)
全部复位后,载入delayed-branch.s,打开延迟槽功能,执行该程序,观察其时钟周期图,记录程序执行的总时钟周期数。
原1.
在延迟槽中放入SW $r1,0($r2)指令,从逻辑上“延长”分支指令的执行时间,把延迟分支看成是由原来的分支指令和延迟槽中的指令构成,不管分支是否成功,都要按顺序执行延迟槽中的指令(SW $r1,0($r2))。
原2.
在延迟槽中放入SW $r1,0($r2)指令,从逻辑上“延长”分支指令的执行时间,把延迟分支看成是由原来的分支指令和延迟槽中的指令构成,不管分支是否成功,都要按顺序执行延迟槽中的指令(SW $r1,0($r2))。
不采用延迟槽:
采用延迟槽:
可以看到采用延迟槽时,执行周期总数为26,比不采用延迟槽少12。控制停顿数为0,比不采用延迟槽少2。
总结
延迟槽技术从逻辑上“延长”分支指令的执行时间,把延迟分支看成是由原来的分支指令和延迟槽中的指令构成,不管分支是否成功,都要按顺序执行延迟槽中的指令。可以将分支指令后应执行的指令或者与分支无关的指令放入延迟槽中,使其在原本暂停指令执行的时间执行,使指令的平均执行周期减少了,性能因此而提高了。
相关文章:

【计算机系统结构实验】实验2 流水线中的冲突实验
2.1 实验目的 加深对计算机流水线基本概念的理解; 理解MIPS结构如何用5段流水线来实现,理解各段的功能和基本操作; 加深对结构冲突/数据冲突/控制冲突的理解; 进一步理解解决数据冲突的方法,掌握如何应用定向技术来…...

conda环境下执行conda命令提示无法识别解决方案
1 问题描述 win10环境命令行执行conda命令,报命令无法识别,错误信息如下: PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径&a…...

链接未来:深入理解链表数据结构(二.c语言实现带头双向循环链表)
上篇文章简述讲解了链表的基本概念并且实现了无头单向不循环链表:链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)-CSDN博客 那今天接着给大家带来带头双向循环链表的实现: 文章目录 一.项目文件规划…...
论文笔记 | Nature 2023 FunSearch:利用大语言模型在数学科学领域探索新的发现
文章目录 一、前言二、主要内容三、总结🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 科学中有许多难以解决的问题,这些问题难以获得确切解答,但却相对容易进行验证。在数学和计算机科学领域,这类问题被称为 NP 完全优化问题(NP-complete optimization pr…...
JavaScript 对象和 JSON 字符串的区别
JavaScript 对象和 JSON 字符串是两种不同的数据表示形式,它们有以下区别: 语法格式:JavaScript 对象是 JavaScript 语言中的一种数据类型,使用花括号 {} 包裹,属性和值之间使用冒号 : 分隔,并且使用逗号 …...
基于 Flink SQL 和 Paimon 构建流式湖仓新方案
目录 1. 数据分析架构演进 2. Apache Paimon 3. Flink + Paimon 流式湖仓 Consumer 机制 Changelog 生成编辑...

MFC静态链接+libtiff静态链接提示LNK2005和LNK4098
编译报错 1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_infoAAEABV0Z) 已经在 libcmtd.lib(typinfo.obj) 中定义 1>msvcrt.lib(ti_inst.obj) : error LNK2005: "pr…...

桶装水送水小程序:提升服务质量的利器
随着移动互联网的发展,越来越多的消费者通过手机在线购物和订购商品。如果你是一名桶装水供应商,想要拓展线上业务,那么开发一个桶装水微信小程序将是一个明智的选择。本文将指导你从零开始开发一个桶装水微信小程序,让你轻松完成…...
深度学习在训练什么,什么是模型
深度学习是机器学习的一个分支,它主要通过使用称为神经网络的复杂结构来学习数据的表征。在深度学习中,"训练"和"模型"是两个核心概念。 训练 在深度学习中,"训练"是指用数据来训练一个神经网络。这个过程涉…...
Andorid 使用bp或者mk编译C文件生成so
在Aosp源码里编译C文件生成so 使用mk编译 文件夹列表 CMkDemo/Android.mk CMkDemo/cpp/SerialPort.c CMkDemo/cpp/SerialPort.hAndroid.mk 内容如下 LOCAL_PATH: $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE_TAGS : optional# All of the source files that we will…...

只更新软件,座椅为何能获得加热功能?——一文读懂OTA
2020年,特斯拉发布过一次OTA更新,车主可以通过这次系统更新获得座椅加热功能。当时,这则新闻震惊了车圈和所有车主,彼时的大家还没有把汽车当作可以“升级”的智能设备。 如今3年过去了,车主对各家车企的OTA升级早已见…...

EfficientDet:Scalable and Efficient Object Detection中文版 (BiFPN)
EfficientDet: Scalable and Efficient Object Detection EfficientDet:可扩展和高效的目标检测 摘要 模型效率在计算机视觉中变得越来越重要。本文系统地研究了用于目标检测的神经网络架构设计选择,并提出了几个关键的优化方法来提高效率。首先&…...

视频监控技术经历了哪些发展阶段?视频监控技术未来趋势展望
随着城市经济的发展和进步,视频监控也已经应用在人们衣食住行的方方面面,成为社会主体的一个重要组成部分。随着视频监控的重要性越来越凸显,大家对视频监控技术的发展也非常关注。今天我们来简单阐述一下,视频监控技术经历的几个…...

德人合科技 | 设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统
设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统 PC端访问地址: www.drhchina.com 一、背景介绍 设计公司通常涉及到大量的创意作品、设计方案、客户资料等重要文件,这些文件往往包含公司的核心价值和商业机密。因此,如何确保…...

类和对象(下篇)
再谈构造函数 构造函数体赋值 在之前的学习中我们知道,在创建一个对象时,我们的编译器就会自动调用构造函数将对象初始化,给对象中各个成员变量一个合适的初始值。 例如: class Date { public:Date(int year, int month, int d…...

华为鸿蒙(HarmonyOS):连接一切,智慧无限
华为鸿蒙是一款全场景、分布式操作系统,旨在构建一个真正统一的硬件生态系统。该操作系统于2019年8月首次发布,并被设计为可以应用于各种设备,包括智能手机、智能手表、智能电视、车载系统等多种智能设备。 推荐一套最新版的鸿蒙4.0开发教程 …...

劈窗算法反演地表温度
目录 摘要操作步骤提取热红外单波段提取NDVI同步像元分辨率与个数劈窗算法地表温度反演制图 摘要 主要使用HJ-2(环境减灾二号卫星)的IRS传感器的两个热红外波段,以及红波段与近红波段计算得到的NDVI,使用劈窗算法,得到…...

持续集成交付CICD:基于ArgoCD 的GitOps 自动化完成前端项目应用发布与回滚
目录 一、实验 1. 环境 2. K8S master节点部署Argo CD 3.基于ArgoCD 实现GitOps (同步部署文件) 4.基于ArgoCD 实现GitOps (同步HELM文件) 二、问题 1. ArgoCD 连接K8S集群状态为 Unknown 2.ArgoCD 创建application失败 …...

SSH无密登陆配置
1 SSH介绍 ssh命令用于远程登录到其他计算机,实现安全的远程管理。 基本语法: ssh 域名/IP地址 示例: (1)从hadoop100服务器上远程连接hadoop101服务器 [hadoophadoop100 ~]$ ssh hadoop101 如果出现如下内容 Ar…...

【bug日记】如何切换jdk版本,如何解决java和javac版本不一致
背景 今天在安装jenkins后,使用java运行war包的时候,提示jdk1.8版本太低,需要提高版本,所以就需要切换jdk版本 解决 在用户变量中,首先更改了JAVA_HOME的地址为17的目录,发现javac的版本改为17了&#x…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...