HNU-计算机体系结构-实验2-Tomasulo算法

计算机体系结构 实验2

计科210X 甘晴void 202108010XXX
在这里插入图片描述

1 实验目的

熟悉Tomasulo模拟器同时加深对Tomasulo算法的理解,从而理解指令级并行的一种方式-动态指令调度。

掌握Tomasulo算法在指令流出、执行、写结果各阶段对浮点操作指令以及load和store指令进行什么处理;给定被执行代码片段,对于具体某个时钟周期,能够写出保留站、指令状态表以及浮点寄存器状态表内容的变化情况。

学习ScoreBoard和Tomasulo算法,并且进行Tomasulo算法的模拟实验,同时熟悉动态指令调度相关知识。

【注】由于老师之前花了三节课时间详细讲解了ScoreBoard和Tomasulo算法,故本实验实际上较为简单,主要是理解。

参考资料:

  • Tomasulo算法模拟器使用方法.doc
  • 芜湖韩金轮:https://blog.csdn.net/qq_51684393/article/details/134891988

2 实验过程

2.0 环境配置

本实验单独使用模拟器Tomasulo.exe,无其它环境配置问题。

2.1 基础知识

①动态调度算法Tomasulo

主要与ScoreBoard差不多,不同点大致在将READ和EXE合并为一个EXE步骤,另外就是寄存器重命名(保留站只保留副本而不是寄存器本身),和广播机制。

我做了一个总结如下,按照这个操作基本上就能跑起来了。

在这里插入图片描述

下面是使用模拟器的教程。

②设置指令和参数

指令种类

  • L.D指令:从主存读取一个双精度浮点数;
  • ADD.D:双精度浮点加法指令;
  • SUB.D:双精度浮点减法指令;
  • MULT.D:双精度浮点乘法指令;
  • DIV.D:双精度浮点除法指令。

各指令执行时间

  • 不同部件,尤其是浮点功能部件,它们的执行时间往往是不同的。特别是除法部件,往往要延迟很多周期。模拟器中可以设置这个时间。

复位

  • 所有设置恢复默认值
③执行
  • 点击“执行”按钮,就进入执行状态。可以用中间的按钮来控制指令的执行,包括“步进”、“退1步”、“前进5个周期”、“后退5个周期”、“执行到底”、“退出”等。还可以用“go”按钮直接跳转到指定的时钟周期。
  • 如果想修改被执行的代码,按“退出”按钮,即可回到设置指令和参数页面。
  • 向前执行后,状态表中抹色的字段表示其内容发生了变化。
④对比状态表
  • 每一个状态表的右上角外侧都有一个小三角,用鼠标左键点击它,会弹出该表在上一个时钟周期的内容。
  • 在弹出表以外的区域再次点击鼠标,就可以将其收回。
⑤各表内容

【指令状态表】列出了各指令什么时候执行到了哪一步。其中的数字表示时钟周期,“~”表示时钟周期期间。

【保留站】给出了各执行部件是否被占用,以及其在该时刻的寄存器依赖信息(是在执行?还是因为哪个寄存器而不能执行?)。其中各字段的名称和含义如下:

  • Time:表示相应的保留站还有要执行多少个时钟周期;
  • 名称:保留站的名称。用于唯一地标识相应的保留站;
  • Op:要对源操作数进行的操作;
  • Qj,Qk:将产生源操作数的保留名称。等于0表示操作数已经就绪且在Vj或Vk中,或者不需要操作数。
  • Vj,Vk:源操作数的值。对于每一个操作数来说,V或Q字段只有一个有效。
  • Busy:为“Yes”表示该保留站 “忙”。

【Load部件】按队列方式工作,每次处理新的访存都是从队列头部取走一条。其中各字段的含义如下:

  • 名称:相应单元的名称(标识);
  • Busy:“忙”标志,为“Yes”表示已被占用;
  • 地址:访存的有效地址;
  • 值:存放从存储器读来的数据。

【寄存器】指明此时寄存器是否被指令占用(需要写回),以及此时的值。该缓冲器各字段的含义如下:

  • 【请注意】这里指导手册上写的是有问题的,与课堂上老师讲的不同,这里有一个BUSY字段比较隐晦难以看到。Qi表示将把结果写入该寄存器的保留站的站号,BUSY字段表示是否被占用。老师上课讲的是,指令写回后擦除Qi字段,但是这个模拟器是把BUSY置空即可,相当于擦除了Qi。也即:只有BUSY为被占用,Qi才有效。
  • Qi:寄存器状态,用于存放将把结果写入该寄存器的保留站的站号。
  • 值:寄存器的值。
  • BUSY:是否被占用。为空则表示当前没有正在执行的指令要写入该寄存器,也即该寄存器中的内容就绪。

最下面,把上面两个值压缩一下,就会出现BUSY字段(这个UI界面怎么这么糟糕)

在这里插入图片描述

当上述表中的内容写不下时,模拟器会采用缩写的方法。这时,在上面中间的区域中会显示缩写及其值。

2.2 模拟算法,回答问题

使用模拟器进行以下指令流的执行并对模拟器截图、回答问题

L.D   F6, 21(R2)
L.D   F2, 0 (R3)
MUL.D  F0, F2, F4
SUB.D  F8, F6, F2
DIV.D  F10,F0, F6
ADD.D  F6, F8, F2

假设浮点功能部件的延迟时间:加减法2个周期,乘法10个周期,load/store2个周期,除法40个周期。

设置如下:

在这里插入图片描述

问题如下:

  • 分别截图(当前周期2和当前周期3),请简要说明load部件做了什么改动
  • 请截图(MUL.D刚开始执行时系统状态),并说明该周期相比上一周期整个系统发生了哪些改动(指令状态、保留站、寄存器和Load部件)
  • 简要说明是什么相关导致MUL.D流出后没有立即执行
  • 请分别截图(15周期和16周期的系统状态),并分析系统发生了哪些变化
  • 回答所有指令刚刚执行完毕时是第多少周期,同时请截图(最后一条指令写CBD时认为指令流执行结束)
问题1

分别截图(当前周期2和当前周期3),请简要说明load部件做了什么改动

当前周期2

在这里插入图片描述

第一条Load指令进入执行1阶段,计算出R[R2]+21并保存在Load1的寄存器中。

第二条Load指令发射,分配使用Load2部件,Busy位置Yes。

当前周期3

在这里插入图片描述

第一条Load指令进入执行2阶段,访存并获得M[R[R2]+21],保存在Load1部件的值寄存器中。

第二条Load指令进入执行1阶段,计算出R[R3]+0并保存在Load2的寄存器中。

问题2

请截图(MUL.D刚开始执行时系统状态),并说明该周期相比上一周期整个系统发生了哪些改动(指令状态、保留站、寄存器和Load部件)

MULT.D开始执行前一步的系统状态

在这里插入图片描述

MULT.D开始执行时的系统状态

在这里插入图片描述

下面比较指令状态、保留站、寄存器和Load部件发生的改动。

  • 指令状态:由于MULT和SUB使用的部件不同,且该步没有寄存器相关的冲突(在前一步,也就是第5步,Load操作写回F2,解除了F2的依赖),故可以同时进入执行状态。又第6条ADD指令的写回寄存器F6刚被Load1指令释放,恰好可以被ADD指令使用,故ADD指令被发射。
  • 保留站:主要是把ADD指令相关的信息写入部件ADD2,BUSY位置1,Op位为ADD,此时ADD需要F2和F8的值,但是F8此时还被前面的SUB指令(ADD1部件)占用(寄存器中F8的Qi字段为ADD1),故Vj空置,Qj写入Add1,由于F2此时已经被释放,Vk可以写入F2的对应值M2(具体问题能算出M2的具体数值,但这里直接给了个未知数代替,是一样的)
  • 寄存器:ADD的目的地址是F6,故F6的Qi字段写入F6.
  • Load部件:该两部未发生访存,也没有Load指令在执行,故无事发生。
问题3

简要说明是什么相关导致MUL.D流出后没有立即执行

简单来说,MULT.D依赖的F2寄存器直到第5周期才被Load2指令写回,故MULT.D只能在第6周期进入执行阶段。

MULT.D指令在第3步流出(即被发射),

目的寄存器是F0,写入【寄存器】部件,

其源寄存器分别是F2和F4,查表【寄存器】部件,发现F2此时被Load2部件占用,将这一信息写入【保留站】中,即Qj字段,

那么只有在F2的占用结束时,MULT.D才能执行。

在这里插入图片描述

问题4

请分别截图(15周期和16周期的系统状态),并分析系统发生了哪些变化

第15周期

在这里插入图片描述

第16周期

在这里插入图片描述

该两步主要聚焦MULT结束它漫长的执行周期后发生的事情。

主要是两件事情:释放部件,更新保留站。

第15周期,MULT结束了它的执行。第16周期,MULT写回F0的结果。并释放自己占用的MULT1部件。同时系统检索整个【保留站】,并释放所有在Qj或Qk字段被打上【因为MULT1部件,而不能执行】的这些行,在vj或vk补上F0的结果。

事实上,这里的DIV指令在第5周期被发射之后,就一直在等待F0被解除占用,现在在第16周期,终于由于MULT更新F0值解除了占用。

下一周期,第17周期,DIV指令进入执行阶段。

问题5

回答所有指令刚刚执行完毕时是第多少周期,同时请截图(最后一条指令写CBD时认为指令流执行结束)

所有指令刚刚执行完毕是第57周期。DIV.D指令在第56周期被执行完毕,在第57周期被写回。

在这里插入图片描述

2.3 思考题

问题1

Tomasulo算法相比Score Board算法有什么异同?(简要回答两点:1.分别解决了什么相关问题,2.两者分别是分布式还是集中式)

分别解决的问题

  • Tomasulo算法和Scoreboard算法都解决了指令级并行处理器中的数据相关性问题。
  • Tomasulo算法通过寄存器重命名和乱序执行技术更有效地解决了数据相关性,允许指令乱序执行,提高了并行度和吞吐量。
  • Scoreboard算法通过中心化的控制单元管理指令的发射和执行,依赖于指令执行的严格顺序,处理数据相关性。

分布式与集中式

  • Tomasulo算法是一种分布式的指令调度算法,每个执行单元都具有独立的调度器,能够并行地调度指令,处理器中各个部分之间通过共享总线或其他通信方式进行通信。
  • Scoreboard算法是一种集中式的控制方法,通过中心化的控制单元管理指令的发射和执行,指令的执行顺序由中心控制器决定,整个处理器的调度是由中心控制器统一管理的。

为什么Tomasulo比ScoreBoard效率更高:

①ScoreBoard存在结构冲突,未使用定向技术

②Tomasulo的WAW和WAR不需要stall,而scoreboard需要检测与stall

问题2

Tomasulo算法是如何解决结构冒险、RAW、WAR和WAW相关的数据冒险?

Tomasulo算法通过以下3个方法解决数据相关性引起的结构冒险、RAW、WAR和WAW相关的数据冒险:

  • 寄存器重命名(Register Renaming):Tomasulo算法使用物理寄存器来存储指令操作数的结果,而不是使用程序中的逻辑寄存器。这样,即使多个指令试图同时写入相同的逻辑寄存器,也不会导致WAR和WAW相关。每个操作数都与一个唯一的物理寄存器相关联,从而避免了数据冒险。(即取了副本而不是寄存器本身)
  • 乱序执行(Out-of-order Execution):Tomasulo算法允许指令按照它们的操作数可用性而不是它们在程序中的顺序来执行。这种乱序执行可以有效地解决RAW相关,因为当一个指令的操作数可用时,它就可以立即执行,而不必等待前面的指令。(这一点ScoreBoard也做到了)
  • 数据依赖检测(Data Dependency Checking):Tomasulo算法中的每个执行单元都会检查指令的操作数是否已经准备好。如果操作数还未准备好,执行单元将等待,直到相关的操作数变为可用。

通过这些技术,Tomasulo算法能够在执行指令时动态地解决结构冒险、RAW、WAR和WAW相关的数据冒险,从而提高了指令级并行处理器的性能和效率。

下面我给出具体示例来说明。

读后写(WAR)冒险

在这里插入图片描述

写后读(RAW)冒险

在这里插入图片描述

写后写(WAW)冒险

在这里插入图片描述

【更进一步讨论极端情况】若两条WAW之间有需要读取F10,第一个W写完之后要更新【保留站】内的逻辑寄存器,但不更新回【寄存器】表内的物理寄存器,因为它已经被后一个W给锚定了。

3 实验总结

本次实验中,我深入研究了动态指令调度算法以及其在指令级并行处理器中的优化应用。通过对Tomasulo算法和相关概念的探索,我得以更全面地理解现代处理器如何通过动态指令调度来提高性能,并在模拟环境中进行了实际操作和观察。

  • 算法原理的理解与应用: 通过实验,我对Tomasulo算法及其在处理器设计中的作用有了更深入的理解。该算法通过寄存器重命名、乱序执行和指令调度等技术,有效解决了数据相关和控制相关问题,实现了指令级并行,从而提高了处理器的吞吐量和性能。
  • 模拟实验的操作与观察: 通过使用Tomasulo模拟器,我能够模拟指令的执行过程,观察指令之间的依赖关系和执行顺序,以及调度单元的工作状态。这些实际操作让我更直观地理解了动态指令调度算法的实际应用,以及在不同场景下的性能表现。
  • 理论与实践相结合的学习: 这次实验不仅强调理论知识的学习,更注重将理论知识应用于实际情境的实践。通过理论分析和模拟实验相结合的方式,我不仅学会了算法的原理,还能够将其应用于实际的处理器设计中,从而更好地理解和掌握动态指令调度的核心思想和实现方式。
  • 深化对处理器性能优化的认识: 通过这次实验,我进一步认识到动态指令调度在处理器性能优化中的重要性。优秀的动态指令调度算法能够有效地提高处理器的并行度和吞吐量,从而加速程序的执行,提升系统的整体性能。

通过本次实验,我不仅加深了对动态指令调度算法的理解,还学会了如何将其应用于指令级并行处理器的优化设计中。这为我今后在计算机体系结构和并行计算领域的学习和研究提供重要的理论基础和实践经验。

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

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

相关文章

AWS存储之Backup

AWS Backup是一项经济高效、完全托管且基于策略的服务,可简化大规模数据保护。它是亚马逊提供的一项全面的备份服务,可用于备份和恢复AWS中的各种数据,包括Amazon EBS卷、Amazon RDS数据库、Amazon DynamoDB等。 AWS Backup 是一项完全托管的…

网络融合的力量:企业如何通过“一网多用”提升业务效率

随着企业业务的不断扩展,网络需求变得日益复杂。需要的是一种能够统一承载办公、生产、销售和运营等多业务需求的网络架构。这种“一网多用”的架构,不仅简化了网络部署和管理,还提升了效率并降低了成本。 “一网多用”架构的实际应用&#x…

Guns框架:基于主流技术Spring Boot2 + Vue3 + Antd Vue的现代Java应用开发新纪元

Guns框架:基于主流技术Spring Boot2 Vue3 Antd Vue的现代Java应用开发新纪元 摘要:随着信息技术的飞速发展,软件开发框架在提升开发效率、降低成本方面扮演着至关重要的角色。Guns框架,作为一个现代化的Java应用开发框架&#x…

微信图片识别文字怎么弄?介绍三个识别方法

微信图片识别文字怎么弄?在信息爆炸的时代,我们每天都会接触到大量的图片信息,其中包含的文字内容往往是我们获取信息的重要途径。然而,手动输入图片中的文字既费时又费力,这时,一款能够准确识别微信图片中…

学习笔记——动态路由协议——OSPF(OSPF基本术语)

OSPF基本术语 1、链路状态(LS)与链路状态通告(LSA) 链路(LINK):路由器上的一个接口。 状态(State):描述接口以及其与邻居路由器之间的关系。 (1)链路状态(LS) OSPF是一种链路状态协议,所谓的链路状态,其实就是路由器的接口状态…

vue中axios的使用

1.get请求 axios.get(http://127.0.0.1:2333/show_course, {params: {param: choice} }) .then((response) > {this.list response.data; }) .catch((error) > {console.error(error); }); 2.post请求:当需要向服务器提交数据以创建新资源时使用。例如&…

Java程序中,不同jar包,有2个完全相同的类,运行时的加载顺序

在Java程序中,如果有两个完全相同的类存在于不同的jar包中,那么在运行时究竟加载哪个类,主要取决于类加载器的类路径(Classpath)搜索顺序。 Java使用类加载器(ClassLoader)来动态加载类。当Jav…

JS导出excel功能

在JavaScript中可以使用第三方库来实现导出Excel的功能&#xff0c;比如使用xlsx库。以下是一个简单的示例&#xff1a; 首先&#xff0c;在html文件中引入xlsx库&#xff1a; <script src"https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.9/xlsx.full.min.js"…

QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

29-ESP32-S3-WIFI篇-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分&#xff0c;其实内容比我想象的要多得多。所以通常来说&#xff0c;如果你想要编写自己的Wi-Fi应用程序&#xff0c;最快捷的方法就是先找一个类似的示例应用&#xff0c;然后将它的相…

实战项目:飞机坦克大战 —— 面向对象编程之旅

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、项目概览与背景介绍 二、面向对象编程基本概念解析 1. 类与对象 2. 构造函数与属性封…

Java对象的揭秘

前言 作为一个 Java 程序员&#xff0c;我们在开发中最多的操作要属创建对象了。那么你了解对象多少&#xff1f;它是如何创建&#xff1f;如何存储布局以及如何使用的&#xff1f;本文将对 Java 对象进行揭秘&#xff0c;以及讲解如何使用 JOL 查看对象内存使用情况。 本文是基…

【JavaScript脚本宇宙】从jQuery到Popmotion:DOM操作和动画库

揭秘流行JavaScript库&#xff1a;从简单操作到复杂动画 前言 随着Web技术的发展&#xff0c;JavaScript库已成为开发人员日常工作中不可或缺的工具。本文将探讨六种流行的JavaScript库&#xff0c;涵盖其概述、主要特性、使用示例及使用场景等多个方面。 欢迎订阅专栏&#…

车载客流统计设备:双目3D还原智能统计算法的应用与优势

随着城市交通的日益繁忙和公共交通系统的不断完善&#xff0c;对公交车等交通工具的客流统计和分析变得越来越重要。传统的客流统计方法往往存在效率低下、精度不足等问题&#xff0c;难以满足现代城市交通管理的需求。而基于双目3D还原智能统计算法的车载客流统计设备&#xf…

智能家居ZigBee网关选型定制指南:主控,操作系统,天线设计,助力IoT开发者

随着科技的发展和人们生活水平的提高&#xff0c;智能家居以其便捷、舒适、安全等特点&#xff0c;逐渐走进千家万户&#xff0c;成为家装消费品换新升级的重要方向。在智能家居系统中&#xff0c;网关扮演着中枢控制器的角色&#xff0c;负责将各种设备连接到互联网上&#xf…

代码随想录算法训练营Day6| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242.有效的字母异位词 知识点补充&#xff1a; 1.遍历HashMap中的值&#xff1a; HashMap<Integer,Integer> map new HashMap<Integer,Integer>(); for(Integer num:map.values()){ } 2.遍历HashMap的键&#xff1a; HashMap<Integer,Integer> map new Ha…

Debian常用命令详解

Debian是一个广泛使用的Linux发行版&#xff0c;以其稳定性和包管理系统的丰富性著称。对于新手和经验丰富的系统管理员来说&#xff0c;掌握常用的Debian命令至关重要。这篇文章将详细介绍Debian系统中常用的命令&#xff0c;包括文件和目录操作、软件包管理、用户和权限管理、…

分布式数据库OceanBase的安装

OceanBase是阿里自研的分布式数据库&#xff0c;单集群规模超过 1500 节点&#xff0c;具有云原生、强一致性、高度兼容 Oracle/MySQL 等特性。今天讲一讲OceanBase的安装&#xff0c;官网上面有详细的介绍&#xff0c;这里主要是针对容器部署详细介绍安装步骤一些过程中遇到的…

【单片机毕设选题】-智能语音控制风扇

一. 系统功能 此设计采用STM32和SU-03T离线语音模块来控制风扇, 主要功能如下: 1. 通过DHT11温湿度模块来采集环境温湿度。 2. 通过SU-03T语音模块来控制风扇启停加减速等。 3. 通过OLED显示系统状态。 4. 可以通过按键控制风扇启停加减速等。 5. 通过蓝牙模块监视系统状…

Tomcat启动过程

ClassLoader初始化 发生在org.apache.catalina.startup.Bootstrap#init() Catalina初始化 1、加载Digester工具 发生在org.apache.catalina.startup.Catalina#load() 2、容器启动&#xff0c;启用StandardContext维持Socket连接 Digester工具初始化 发生在org.apache.catali…