计算机体系结构基础知识介绍之使用动态调度、多重问题和推测来利用流水线

news2025/1/11 3:40:30

我们已经了解了动态调度、多发射和推测等单独的机制是如何工作的。(具体请参见本人前几篇博客)

现在我们把这三种机制结合起来,得到一种和现代微处理器非常相似的微架构。为了简单起见,我们只考虑每个时钟周期发射两条指令的情况,但是这些概念也适用于每个时钟周期发射三条或更多指令的现代处理器。我们假设我们想要扩展Tomasulo算法,以支持多发射超标量流水线,它有独立的整数、加载/存储和浮点(包括浮点乘法和浮点加法)功能单元,每个功能单元每个时钟周期都可以开始一个操作。

我们不想让指令以乱序的方式发射到预约站,因为这可能会违反程序的语义。为了充分利用动态调度的优势,我们将允许流水线在一个时钟周期内发射任意组合的两条指令,使用调度硬件来实际分配操作到整数和浮点单元。

如图所示,基本的组织结构类似于一个具有推测执行和每个时钟周期一条发射的处理器,只是发射和完成逻辑必须增强,以允许每个时钟周期处理多条指令。

在一个动态调度的处理器中(无论是否有推测执行),每个时钟周期发射多条指令是非常复杂的,因为这些指令可能相互依赖。因此,必须同时更新表格中的指令信息;否则,表格可能会不正确或者依赖关系可能会丢失。

有两种不同的方法可以在一个动态调度的处理器中每个时钟周期发射多条指令,而且都依赖于这样一个观察:关键在于分配预约站并更新流水线控制表格。一种方法是让这一步在半个时钟周期内运行,这样就可以在一个时钟周期内处理两条指令;但是这种方法不能很容易地扩展到每个时钟周期处理四条指令的情况。另一种方法是构建必要的逻辑来同时处理两条或更多指令,包括指令之间可能存在的任何依赖关系。现代超标量处理器可以发射四条或更多指令每个时钟周期,可能包含两种方法:它们既流水线化又扩展了发射逻辑。

一个关键的观察是我们不能简单地通过流水线化来解决问题。通过让指令发射需要多个时钟周期来完成,因为新的指令每个时钟周期都在发射,我们必须能够分配预约站并更新流水线表格,以便下一个时钟周期发射的依赖指令可以使用更新后的信息。

我们在动态调度的超标量处理器中,发射指令的步骤是一个最基本的瓶颈。在一个现代的超标量处理器中,每个时钟周期允许发射的所有可能的依赖指令组合都必须考虑。因为可能性的数量随着每个时钟周期可以发射的指令数量的平方而增长,所以发射步骤是超过四条指令每个时钟周期的尝试的一个可能的瓶颈。我们可以把细节概括为以下步骤,来描述在一个动态调度的超标量处理器中,每个时钟周期最多发射n条指令时,更新发射逻辑和预约表格的基本策略:

  1. 为每一条可能在下一个发射包中发射的指令分配一个预约站和一个重排序缓冲区。这个分配可以在指令类型未知之前完成,只需按顺序把重排序缓冲区条目预分配给包中的指令,使用n个可用的重排序缓冲区条目,并确保有足够的预约站来发射整个包,不管它包含什么。通过限制一类指令(比如说,一个浮点、一个整数、一个加载、一个存储)的数量,必要的预约站可以预分配。如果没有足够的预约站(比如说,程序中接下来的几条指令都是同一种类型),那么包就会被打断,只有一部分指令按照原始程序顺序被发射。包中剩余的指令可以放在下一个包中等待发射。
  2. 分析发射包中指令之间的所有依赖关系。
  3. 如果包中的一条指令依赖于包中更早的一条指令,就用分配好的重排序缓冲区编号来更新被依赖指令的预约表。否则,就用现有的预约表和重排序缓冲区信息来更新发射指令的预约表条目。当然,让这些步骤变得非常复杂的是它们都要在一个时钟周期内并行地完成

在流水线的后端,我们必须能够每个时钟周期完成和提交多条指令。这些步骤比发射问题稍微容易一些,因为能够在同一个时钟周期提交的多条指令必须已经处理并解决了任何依赖关系。

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

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

相关文章

《算法竞赛·快冲300题》每日一题:“窗户”

《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 窗…

es6 数组操作个人总结

es6 数组操作个人总结 动机数组数组生成可枚举对象转数组箭头函数筛选判断所有元素枚举循环 小结 动机 es6 ,说白了,就是增强版本的 js 。。。。。嗯,说到底,还是原生 js 罢了,不过比原有的 js 多了一些属性、类型、指…

【c++修行之路】智能指针

文章目录 前言为什么用智能指针智能指针简单实现unique_ptrshared_ptr 循环引用和weak_ptr的引入循环引用weak_ptr 定制删除器 前言 大家好久不见,今天来学习有关智能指针的内容~ 为什么用智能指针 假如我们有如下场景: double Div() {int x, y;cin …

Clion 配置Mingw64的 c++开发环境

1、Mingw64的安装与环境变量的配置 Mingw64文件下载 Mingw64下载地址:https://sourceforge.net/projects/mingw-w64/files/ posix相比win32拥有C 11多线程特性,sjlj和seh对应异常处理特性,sjlj较为古老,所以选择seh 配置环境变…

MongoDB踩过的坑

目录 启动MongoDB服务 可视化工具:MongoDB Compass 由于目标计算机积极拒绝,无法连接 BSONObj size: xxxx is invalid. Size must be between 0 and 16793600 (16MB) 启动MongoDB服务 1. 打开CMD 2. 进入安装MongoDB文件夹中的bin目录 3. mongod -…

mapBox 绘制多边形无法设置 边框宽度 解决方法

目录 一、问题 二、解决方法 三、总结 tips:如嫌繁琐,直接看有颜色的文字即可! 一、问题 1.使用mapBox在地图上绘制点、线、面。绘制多边形的时候发现 直接用 zh(一家提供地图引擎的公司),提供的绘制多边形的方法无法设置边框颜色和边框宽度。很是离…

龙蜥社区 6 月技术委员会会议召开!欢迎 5 位开放原子 TOC 导师加入

2023 年 6 月 16 日上午 10 点召开了龙蜥社区 6 月技术委员会线上会议,共计 38 人参会。本次会议由联通肖微主持,会议也荣幸的邀请到了开放原子 TOC 导师线上参会,技术委员们来自阿里云、统信、飞腾、中科方德、红旗、万里红、Intel、Arm、龙…

入门篇:从零上手GitOps

文章目录 GitOps 介绍如何将业务代码构建为容器镜像?如何将容器镜像部署到K8s?K8s如何实现自动扩容和自愈?1.传统的扩容和自愈2.k8s自愈机制3.k8s弹性扩容 如何借助GitOps实现应用秒级自动发布和回滚?1.传统 K8s 应用发布流程2.从…

高级细腻的家居照明,欧瑞博智能无主灯是怎么实现的?

作者 | 辰纹 来源 | 洞见新研社 如今的现代生活,人类对光的需求已超越简单照明,而是希望在不同场景下能有专属的细腻用光体验,智能照明应运而生,并成为上升趋势。现阶段,精细化家居需求要求智能照明不仅要巧妙融合美学…

二叉树进阶(AVLTree)

目录 1.AVLTree概念 2.AVLTree模拟实现 2.1 AVLTree节点 2.2 插入实现基本框架 2.3 左单旋 2.4 右单旋 2.5 LR双旋 2.6 RL双旋 2.7 AVLTree树验证 1.AVLTree概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树&#…

怎么从电影中截取动图?试试这个工具

图片、视频等都是当代流行的表达情感、传递信息的一种方式。其中,当属gif动图最受大众的欢迎,它比普通的静态图片画面丰富,又比视频的体积小。那么,如何从视频中截取动图呢?使用GIF中文网的视频转gif(https…

通过platform实现阻塞IO来驱动按键控制LED灯的亮灭

通过platform阻塞IO来驱动按键控制LED灯的亮灭 a .应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c .number的值随着按键按下而改变(按键中断)例如number0按下按键number1 ,再次按下按键number0 d .在按下按键的时候需要同时将…

【Leetcode】42.接雨水(困难)

一、题目 1、题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6…

雪花算法 — 集群高并发情况下如何保证分布式唯一全局ID生成?

雪花算法 问题 为什么需要分布式全局唯一ID以及分布式ID的业务需求 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识: 如在美团点评的金融、支付、餐饮、酒店猫眼电影等产品的系统中数据逐渐增长,对数据库分库分表后需要有一…

接口测试辅助,Fiddler抓取安卓手机https请求(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Fiddler 是一款免…

Java设计模式之行为型-迭代器模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 迭代器模式是一种常用的设计模式,它主要用于遍历集合对象,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 举个简单的…

第二章:Cyber RT通信机制解析与实践

Cyber RT解析与实践 第二章:Cyber RT通信机制解析与实践 Cyber RT解析与实践 Cyber RT解析与实践一、Cyber RT 通讯机制简介1. 话题2. 服务3. 参数 二、数据通信基础Protobuf1. Protobuf 简介2. Protobuf 创建3. Protobuf 编译4. Protobuf 案例实战 三、Cyber RT 话…

CPU性能指标简览

作为计算机的运算核心和控制核心,CPU(Central Processing Unit)由运算器、控制器、寄存器和实现其之间联系的数据、控制及状态的总线构成,决定着计算机运算性能强弱。作为信息技术产业的核心基础元器件,CPU的运作可分为…

3-40V输入,2.7V启动,20A电流,PWM\模拟信号调光

应用说明: Hi600X 是一系列外围电路简洁的宽调光比升压恒流驱动器,适用于 3-40V 输入电压范围的 LED 照明领域。 Hi600X 系列芯片,2.7V 启动电压,工作电压范围 5-40V,VIFB反馈电压 0.2V,提高整体转换效率。…

JVM的类加载机制和垃圾回收机制

目录 类加载机制类加载机制的步骤加载验证准备解析初始化 双亲委派模型工作原理双亲委派模型的优点 垃圾回收机制死亡对象的判断可达性分析算法可达性分析算法的缺点引用计数算法循环引用问题 垃圾回收算法标记-清除算法复制算法标记-整理算法分代算法 类加载机制 对于任意一个…