计算机体系结构基础知识介绍之动态调度Tomasulo 算法(二)

news2024/11/16 3:16:50

Tomasulo方法是一种计算机硬件架构的算法,用于动态调度指令的执行,允许乱序执行以及更有效率的使用多个执行单元。它由IBM公司在1967年提出,首次应用是在IBM System/360 Model 91的浮点单元上。Tomasulo方法的主要创新包括在硬件中进行寄存器重命名、为所有执行单元设置预留站、以及使用一个公共数据总线(CDB)来广播计算出的值给所有可能需要它们的预留站。这些发展使得指令能够更好地并行执行,避免了在使用记分板或其他早期算法时可能出现的停顿。Tomasulo方法还可以扩展到处理推测,一种通过预测分支的结果,执行预测目标地址的指令,并在预测错误时采取纠正措施来减少控制依赖影响的技术。

介绍一下假依赖和真实的数据依赖。假依赖是指两个指令之间没有真正的数据流,但是由于使用了相同的寄存器名字而造成的依赖关系。例如,如果指令A写入寄存器f0,然后指令B读取寄存器f0,那么就有一个真实的数据依赖,因为B需要等待A的结果。但是,如果指令A写入寄存器f0,然后指令B写入寄存器f0,那么就有一个假依赖,因为B并不需要A的结果,而是要覆盖它。这种假依赖叫做输出依赖(WAW),因为两个指令都要写入同一个寄存器。另一种假依赖叫做反依赖(WAR),因为一个指令要写入一个寄存器,而另一个指令要读取同一个寄存器。例如,如果指令A写入寄存器f0,然后指令B读取寄存器f0,那么就有一个反依赖,因为如果B先于A执行,那么就会读取错误的值。

假依赖会限制指令的乱序执行,因为它们会造成冒险。冒险是指由于流水线中的指令之间的依赖关系而导致的潜在错误或停顿。例如,如果有一个WAW冒险,那么就意味着后面的指令可能会比前面的指令先完成,并且把前面的指令的结果覆盖掉。如果有一个WAR冒险,那么就意味着后面的指令可能会比前面的指令先执行,并且读取错误的值。

Tomasulo方法可以通过在硬件中进行寄存器重命名来消除假依赖和避免冒险。寄存器重命名是指用一组临时寄存器来代替原来的寄存器名字,从而让每个指令都有自己独立的目标寄存器。这样就可以避免两个指令之间因为使用同一个寄存器名字而产生的假依赖。例如,我们可以用S和T来代替f6和f8,从而消除了反依赖和输出依赖。

当然,这种重命名并不会影响真实的数据依赖,因为真实的数据依赖是由于数据流而产生的,而不是由于寄存器名字而产生的。

 

例如,在上面的代码序列中,我们还是要保留f0作为fdiv.d和fadd.d之间的数据传递方式,因为这是一个真实的数据依赖。真实的数据依赖不能被消除,但是可以通过动态调度来减少它们造成的停顿。这样就可以让一些没有数据依赖或者已经解决了数据依赖的指令先执行,并且利用多个执行单元来提高并行度。

Tomasulo可以通过使用预留站来提供寄存器重命名,从而消除假依赖和避免WAR和WAW冒险。

预留站是一种缓冲器,它与功能单元相关联,可以存储等待发射的指令的操作数。基本的思想是,预留站在操作数可用时就立即获取并缓冲它,从而不需要从寄存器中读取它。另外,等待的指令指定将提供其输入的预留站的名字。

当指令被发射时,等待操作数的寄存器标识符被重命名为预留站的名字,这就实现了寄存器重命名。因为预留站的数量可能比真实寄存器的数量多,所以这种技术甚至可以消除编译器无法消除的由于名字依赖而产生的冒险。

使用预留站而不是集中式寄存器文件还带来了另外两个重要的特性。
第一,冒险检测和执行控制是分布式的:每个功能单元处的预留站中保存的信息决定了一个指令何时可以在该单元开始执行。
第二,结果直接从缓冲它们的预留站传递给功能单元,而不是通过寄存器。这种绕过是通过一个公共结果总线来完成的,它允许所有等待操作数的单元同时加载(在360/91上,这叫做公共数据总线或CDB)。在每个时钟周期可以发射多条指令并且有多个执行单元的流水线中,需要多于一个结果总线。

下图显示了一个基于Tomasulo方法的处理器的基本结构,包括浮点单元和加载/存储单元;没有显示任何执行控制表。每个预留站保存一个已经被发射并且等待在功能单元执行的指令。如果该指令的操作数值已经被计算出来,它们也被存储在该条目中;否则,预留站条目保持将提供操作数值的预留站的名字。加载缓冲区和存储缓冲区保存从内存来或者去内存的数据或地址,并且几乎完全像预留站一样工作,所以我们只在必要时区分它们。浮点寄存器通过一对总线连接到功能单元,并且通过一个单独的总线连接到存储缓冲区。所有来自功能单元和内存的结果都通过公共数据总线发送,它到处都有,除了加载缓冲区。所有预留站都有标签字段,由流水线控制使用。

使用 Tomasulo 算法的 RISC-V 浮点单元的基本结构。 指令从指令单元发送到指令队列,并按照先进先出 (FIFO) 顺序发出。 保留站包括操作和实际操作数,以及用于检测和解决危险的信息。 加载缓冲区具有三个功能:(1) 保存有效地址的组成部分,直到计算出来;(2) 跟踪内存上等待的未完成加载;(3) 保存等待 CDB 的已完成加载的结果 。 类似地,存储缓冲区具有三个功能:(1)保存有效地址的组成部分直到计算出来,(2)保存等待数据值存储的未完成存储的目标内存地址,以及(3)保存 要存储的地址和值,直到内存单元可用。 来自 FP 单元或加载单元的所有结果都放在 CDB 上,CDB 进入 FP 寄存器文件以及保留站和存储缓冲区。 FP加法器实现加法和减法,FP乘法器实现乘法和除法。

在Tomasulo方法中,一个指令会经历三个步骤,分别是:

  1. 发射——从指令队列的头部获取下一条指令,指令队列是按照先进先出的顺序维护的,以确保正确的数据流。如果有一个空闲的与指令匹配的预留站,就把指令发射到预留站,并且带上操作数值。如果没有空闲的预留站,那么就有一个结构冒险,指令发射就会停顿,直到有一个预留站或缓冲区被释放。如果操作数不在寄存器中,就跟踪将产生操作数的功能单元。这个步骤重命名寄存器,消除了WAR和WAW冒险。(在动态调度的处理器中,这个阶段有时候叫做分派。)
  2. 执行——如果一个或多个操作数还没有准备好,就在等待它们被计算的同时监视公共数据总线。当一个操作数可用时,它就被放入任何等待它的预留站中。当所有操作数都可用时,操作就可以在相应的功能单元执行。通过延迟指令执行直到操作数可用,RAW冒险就被避免了。(一些动态调度的处理器把这个步骤叫做“发射”,但是我们使用“执行”这个名字,它是在第一个动态调度的处理器CDC 6600中使用的。)
  3. 写结果——当结果可用时,把它写到公共数据总线上,然后从那里写入寄存器和任何等待这个结果的预留站(包括存储缓冲区)。存储被缓冲在存储缓冲区中,直到要存储的值和存储地址都可用;然后在内存单元空闲时把结果写入。

检测和消除冒险的数据结构,它们附加在预留站、寄存器文件、加载缓冲区和存储缓冲区上,不同的对象有不同的信息。这些标签本质上是一组扩展的虚拟寄存器的名字,用于重命名。

例如,标签字段是一个4位的量,表示五个预留站或五个加载缓冲区中的一个。这种组合产生了相当于10个寄存器(5个预留站+5个加载缓冲区)的效果,它们可以被指定为结果寄存器(与360架构包含的四个双精度寄存器相反)。在一个有更多真实寄存器的处理器中,我们希望重命名能提供一个更大的虚拟寄存器集合,通常是数百个。

标签字段描述了哪个预留站包含了将产生作为源操作数所需结果的指令。一旦一个指令被发射并且等待一个源操作数,它就通过被分配了将写入寄存器的指令所在的预留站的编号来引用操作数。未使用的值,比如零,表示操作数已经在寄存器中可用。因为预留站的数量比实际寄存器编号多,WAW和WAR冒险通过使用预留站编号来重命名结果而被消除。

虽然在Tomasulo方法中,预留站被用作扩展的虚拟寄存器,但是其他方法可以使用一个有额外寄存器的寄存器集合或者像重排序缓冲区这样的结构。在Tomasulo方法中,以及支持推测的方法中,结果通过一个总线(CDB)广播,它被预留站监视。公共结果总线和从总线上检索结果到预留站的组合实现了静态调度流水线中使用的转发和绕过机制。在这样做时,一个动态调度方案,比如Tomasulo算法,在源和结果之间引入了一个周期的延迟,因为结果和它的使用之间的匹配不能在写结果阶段结束之前完成,而不是像一个更简单的流水线那样在执行阶段结束时完成。因此,在一个动态调度流水线中,在产生结果和消耗结果之间的有效延迟至少比产生结果的功能单元的延迟长一个周期。

在Tomasulo方法中,标签指向将产生结果的缓冲区或单元;当指令发射到预留站时,寄存器名字就被丢弃了。(这是Tomasulo方法和记分板之间的一个关键区别:在记分板中,操作数保留在寄存器中,并且只有在产生指令完成并且消耗指令准备好执行时才被读取。)每个预留站有七个字段:

■ Op——要对源操作数S1和S2执行的操作。
■ Qj,Qk——将产生相应源操作数的预留站;零值表示源操作数已经在Vj或Vk中可用,或者不需要。
■ Vj,Vk——源操作数的值。注意,对于每个操作数,只有V字段或Q字段是有效的。对于加载,Vk字段用来保存偏移量字段。
■ A——用来保存加载或存储的内存地址计算的信息。最初,指令的立即数字段被存储在这里;在地址计算后,有效地址被存储在这里。
■ Busy——表示这个预留站和它附带的功能单元被占用。

寄存器文件、加载缓冲区和存储缓冲区的数据结构,它们也有一些标签字段。这些字段有:

■ Qi——包含了将要把结果存储到这个寄存器的操作的预留站的编号。如果Qi的值是空白(或0),那么没有当前活跃的指令正在计算一个要写入这个寄存器的结果,意味着这个值就是简单地寄存器内容。
■ A——在执行的第一步完成后,保存有效地址的结果。

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

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

相关文章

轻松学习阿里云原生内存数据库Tair

📖轻松学习阿里云原生内存数据库Tair 🚀前言☁️什么是Redis?☁️什么是云原生内存数据库?✨特点 🚀阿里云原生内存数据库Tair👻简介✨功能特性🗺️应用场景 ✍️上手案例🎯 基于Red…

PCB笔记(PCB设计流程)

双层PCB设计流程(以AD10为例) 1. Preferences常规设置2. 画好原理图后3.编译工程,看是否有错4.然后执行更新到PCB5. 布线前常规规则设置6. 布局之后开始布线7.布线结束之后,开始铺铜8. 创建铜皮之前调丝印,将所有丝印调…

力扣 -- 剑指 Offer II 091. 粉刷房子

题目链接:剑指 Offer II 091. 粉刷房子 - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码: class Solution { public:int minCost(vector…

MIT 6.S081 教材第八章内容 -- ext3 -- 05

MIT 6.S081 教材第八章内容 -- ext3 -- 05 引言为什么需要日志系统XV6 File system logging回顾ext3 file system log formatext3如何提升性能ext3文件系统调用格式ext3 transaction commit步骤ext3 file system恢复过程为什么新transaction需要等前一个transaction中系统调用执…

FFMPEG 编译流程(极客版)

前言 依葫芦画瓢 全程30分钟从零完成ffmpeg编译,主打的就是一个极客 编译环境 OS 要求:Ubuntu 20.04 LTS VMware新建虚拟机 NDK 要求:android-ndk-r20b FFmpeg 功能模块: libavformat:多媒体文件或协议的封装和解封装库&a…

DynaSLAM代码详解(5) — Tracking.cc跟踪线程

目录 5.1 DynaSLAM中Tracking线程简介 5 .2 RGBD模式下跟踪流程 5.3 DynaSLAM的低成本跟踪 (1) Tracking::LightTrack() 低成本跟踪函数 (2) Tracking::LightTrackWithMotionModel() 低成本的恒速模型跟踪流程 5.4 DynaSLAM的正常跟踪 文章着重将与ORB-SLAM2不同的地方&a…

智能工厂:智能制造数字化转型解决方案

数字化已经成为制造业发展的必由之路。要提高生产效率和管理水平,就需要提高对生产运维各环节的数据采集、处理和利用效率。当前工厂的数据采集仍存在诸多不足,可以利用具有多种设备接入能力、通信协议转换能力、数据通信能力、控制维护能力的工业智能网…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)

《Electric Dreams》项目中提供了一些自定义节点和子图(文件位置:“/Content/PCG/Assets/PCGCustomNodes”),这些节点和子图在《Electric Dreams》被广泛使用,对于理解《Electric Dreams》非常重要,而且它们可以直接移…

Qt的对话框与窗口--多文档界面MDI(Multi-document Interface))

多文档界面MDI MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口上的工具栏和菜单等操作功能,主窗口上的操作都针对当前活动的MDI子窗口进行。 设计MDI应用程序需要在主窗口工作区放置一个QMdi…

MySQL:我的从库竟是我自己!?

本文将通过复制场景下的异常分析,介绍手工搭建MySQL主从复制时需要注意的关键细节。 作者:秦福朗 爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱互联网,会摄影、懂厨艺,不会厨艺的 DBA 不是好司机…

多行文本转成一行的实现方法

哈喽大家好,我是咸鱼 不知道你们有没有遇到过下面的情况,以我为例 有时候我会收到批量操作服务器的需求,且我会拿到一个服务器 ip 列表,它是一个多行的形式,如下所示 # ip 列表 192.168.0.1 192.168.0.2 192.168.0.…

原油天然气的区别和用途

原油天然气在市场交易中都是重要的交易产品,经常有小伙伴在后台咨询Forexclub,原油天然气的区别和用途,今天这篇文章就和小伙伴一起交流研究。 其实在Forexclub看来原油和天然气的提取方法、来源和用途几乎相同,只是在适用范围和运…

推荐系统构建

从0到1打造推荐系统工程实战_推荐系统_Jay Wu_InfoQ写作社区

并行程序设计 pthread

配置环境 pthread是c的扩展库,需要配置环境,不过vscode的mingw里面本来就有,谢谢呢^_^ cd “d:\sylvia\文件夹等等等” ; if ($?) { g helloworld.cpp -o helloworld } ; //编译 if ($?) { .\helloworld 线程数} //运行 常用变量声明及函…

三雄极光“设计有光·亚洲设计师迪拜对话”逐光之旅圆满收官

7月8日,三雄极光照明学院“设计有光亚洲设计师迪拜对话”游学旅程圆满收官。过去两周内,此次活动备受关注,设计大咖纷纷为此次迪拜游学一带一路逐光之旅打call。出发前,启动礼于三雄极光总部隆重举行,总裁张宇涛出席并…

F - Desktop Rearrangement

大意: 给你一个桌面状态,每次俩种操作桌面可以表示为一个大小为nm的矩形矩阵&#xff0c;由字符.&#xff08;桌面上的空单元格&#xff09;和*&#xff08;一个图标&#xff09;组成。 操作: 输入<x,y>表示改变其状态的单元格的位置&#xff08;如果该单元格以前包含…

如何在.NET 自动安装包项目(Visual Studio Installer Projects)中设置安装包自动安装 .NET Framework环境

如何在.NET 自动安装包项目(Visual Studio Installer Projects)中设置安装包自动安装 .NET Framework环境 前言 ​ Microsoft Visual Studio Installer Projects是一组用于创建安装程序的工具&#xff0c;它是Microsoft Visual Studio的扩展。这些工具允许开发人员在Visual St…

Java开发基础系列(二):数据类型

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(二):数据类型 ⏱️ 创作时间&#xff1a; 2023年07月…

生产消费者模型

生产消费者模型概念 生产消费者模型实际上就是通过一个容器&#xff0c;将生产者和消费者之间的强耦合问题解决掉。 没有使用生产者消费者模型时&#xff0c;生产者和消费者之间直接相互联通&#xff0c;两者之间强耦合&#xff0c;若是一方更换&#xff0c;那另一方也需要随之…

在 Jetpack Compose 中使用 ViewPager

简介 Jetpack Compose 是一个现代化的&#xff0c;声明式的 UI 工具包&#xff0c;让我们可以更方便地构建原生 Android UI。在本篇文章中&#xff0c;我们将会讨论如何在 Jetpack Compose 中使用 ViewPager。 什么是 ViewPager? ViewPager 是一个提供左右滑动切换视图的 U…