CPU Study - Pipeline Basic

参考来源:《超标量处理器设计》—— 姚永斌

超标量处理器

一个程序执行时间的公式如下,而这个公式通常也反映了处理器的性能:
CPI
图中的CPI - Cycle Per Instruction也就是CPU每条指令需要的周期数量,CPI计算方法就是周期数量除以这段周期内的指令数量。
而基于CPI,就有IPC - Instructions Per Cycle参数,定义执行一条指令需要多少时钟周期,属于更为通用的定义处理器性能的参数。

通常有以下几个加快处理器速度方法:

  • 减少指令数量
  • 减少CPI,让每个周期执行更多指令,也就是增加IPC,让一个指令的执行时间更短
  • 超频,减少单个周期时间

超标量处理器就是通过在同一个时间内并行执行n条指令来提高IPC的n-way处理器,拥有以下优势:

  • 可以通过硬件或者软件配合编译器支持决定哪些指令可以并行执行
  • 每个周期可以从Instruction Cache中取出n条指令送到CPU流水线,CPU每个周期也可以执行n条指令(n-way超标量处理器)
  • 支持超长指令字(Very Long Instruction Word, VLIW)

后续文章中会围绕超标量流水线处理器的设计进行分享,这里先对于Pipeline进行分享。

Pipeline

流水线设计是超标量处理器中基础的一环,理想情况下,流水线具有以下特征:

  • 每个阶段所需要的时间近似
  • 每个阶段操作重复执行(实际存在依赖空档期)
  • 各个操作阶段之间相互独立、互不干扰(实际RAW场景是相互依赖的)

假设处理器没有使用流水线的周期为D,频率为1/D。在n级流水线中周期为"D/n + S",S为流水线寄存器的延时,变化信息如下所示:
流水线
可以看到,流水线在延时S不影响整体的前提下,能有效提高处理器频率。
当然,更多的流水线设计也会更多消耗硬件面积资源。

不同指令集的流水线实现复杂度也不同:
CISC指令长度以及执行时间不等,实现流水线较为复杂。
RISC指令长度相等,指令执行任务较为规整,比较容易实现流水线。

RISCV流水线如下如图所示:
RISCV PIPE

阶段任务
Fetch取指令,使用PC寄存器的数值作为地址,从I-Cache取指令并存储在指令寄存器中
Decode & RegFile read指令解码,根据结果读取寄存器堆(register file)获取指令源操作数
Execute根据指令类型,完成计算任务。例如算数类型进行算数运算,访存类型完成地址计算
Memory访问D-Cache,主要面向读load/写store指令,其他指令类型此阶段不执行
Write Back若指令存在目的寄存器,将最终结果写到目的寄存器

流水线指令相关性

RAW-先写后读
Read指令操作数来自之前指令Write的,此场景下是强依赖关系。

Write: R1 = R2 + R3
Read: R5 = R1 + R4 // R5结果依赖R1数值

WAR-先读后写
Write指令需要将结果写到某个寄存器中,但是这个寄存器还在被其他指令Read,无法立即写入。

Read: R1 = R2 + R3
Write: R2 = R5 + R4 // R2状态受到之前的访问限制

上述这种情况都可以通过修改下一条指令写入位置(不写入R2寄存器)避免依赖。

WAW-先写后写

Write: R1 = R2 + R3
Write: R1 = R5 + R4

这种依赖性也是可以通过将第二条指令写入其他寄存器避免。

还有一些指令的相关性类型如下:

控制相关性
分支指令引起,只有分支结果确定后,才知道从哪里取得后续指令执行。只能通过预测的方法取指。

存储器相关性
当两个寄存器存储的数值来源的内存地址一样时,会存在隐蔽的相关性。

sw	r1, 0(r5) // 将寄存器r1数值保存到MEM[r5]
lw	r2, 0(r6) // 将MEM[r6]数值读取到r2寄存器

直接看上面的指令很难看出两条指令的相关性,但实际上r5寄存器数值和r6寄存器数值都来自于一块内存。
那么第二条指令的读取,必须等待第一条指令的写入才可以,即RAW的依赖。

而这些指令相关性都会阻碍超标量处理器中的指令乱序执行,都需要在流水线中进行特殊处理,后续会在这篇文章介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

串口屏控制的自动滑轨(未完工)

序言 疫情期间自己制作了一个自动滑轨,基于无线遥控的,但是整体太大了,非常不方便携带,所以重新设计了一个新的,以2020铝型材做导轨的滑轨,目前2020做滑轨已经很成熟了,配件也都非常便宜&#x…

Python 自动化脚本集合:开源免费、跨平台、助你告别重复劳动、高效便捷完成各种任务!

引言 你是否也厌倦了重复繁琐的操作?让 Python-Geeks 的 Automation-scripts 库来替你完成重复工作!这个仓库汇聚了200多个各种实用且高效的 Python 脚本,可以自动执行各种任务,让你从繁重的劳动中解放出来,真正享受生…

A011-基于SpringBoot的视频点播系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装视频点播系统软件来发挥其高效地信息处理的作用&#xff0c…

JAVA学习日记(十一) 常用API

一、Math //开平方根 public static double sqrt(double a); //返回结果 //开立方根 public static double cbrt(double a); 水题: public class Main {public static void main(String[] args) {//统计一共有多少个水仙花数 : abca^3b^3c^3abc// aabc/100%10//…

数据结构 —— 红黑树

目录 1. 初识红黑树 1.1 红黑树的概念 1.2 红⿊树的规则 1.3 红黑树如何确保最长路径不超过最短路径的2倍 1.4 红黑树的效率:O(logN) 2. 红黑树的实现 2.1 红黑树的基础结构框架 2.2 红黑树的插⼊ 2.2.1 情况1:变色 2.2.2 情况2:单旋变色 2.2…

Java多线程--Thread类的那些事3.--线程的6中状态和sleep()和 join()

一.sleep()方法 首先在Thead类中有一个静态的sleep()方法,可以让线程进入到休眠状态即TEMD-WAITING状 在调用sleep()方法时需要注意的是在哪个线程里面调用sleep()方法,哪个线程就会进入阻塞状态.,在这个线程中的其他线程不会发生阻塞, 只有当休眠时间到来这个线程才会继续执行…

MySQL表设计(三大范式 表的设计)

1.上讲约束复习: 1.NOT NULL 非空约束,被指定NOT NULL的列,值不允许为空(必填) 2. UNIQUE 唯一约束,这个列里的值在表中是唯一的,也就是说不能重复 3. PRIMARY KEY 主键约束,可以看做是NOT NULL和UNIQUE…

基于SpringBoot的免税商品优选购物商城的设计与实现

一、项目背景 从古至今,通过书本获取知识信息的方式完全被互联网络信息化,但是免税商品优选购物商城,对于购物商城工作来说,仍然是一项非常重要的工作。尤其是免税商品优选购物商城,传统人工记录模式已不符合当前社会…

RabbitMQ 存储机制

一、消息存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘,非持久化的消息一般只保存在内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存空间。这两种类型的消息的落盘处理都…

Kafka自动生产消息软件(自动化测试Kafka)

点击下载《Kafka服务端(含Zookeeper)一键自启软件》 点击下载《kafka客户端生产者消费者kafka可视化工具(可生产和消费消息)》 点击下载《Kafka自动生产消息软件》 1. 前言 在软件开发过程中,Kafka常被用作消息队列来处理特定的业务功能。为…

C#应用随系统启动 - 开源研究系列文章

上次写过一个随系统启动的例子,不过那个是写到注册表中的,自从更新Windows操作系统后就不好使了,所以就换了个方式,只是将应用的快捷方式添加到操作系统的启动目录里,这样随系统启动。 1、 项目目录; 2、 源…

大语言模型在交通领域的应用分析

大语言模型在交通领域的研究进展 前言: 大语言模型(Large Language Models, LLMs)如 GPT (Generative Pre-trained Transformer) 系列,BERT (Bidirectional Encoder Representations from Transformers) 和其他基于 Transformer …

快速删除iPhone照片:释放你的空间,加速你的手机

随着时间的推移,我们的iPhone往往会积累下大量的照片,这不仅占用了大量的存储空间,还可能影响手机的性能。如果你正寻找一种快速、高效的方法快速删除iPhone照片,以下的策略将会大有帮助。此外,本文还将介绍如何利用Cl…

matlab 质心重合法实现点云配准

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果本文由CSDN点云侠原创,原文链接,首发于:2024年11月5日。 一、算法原理 1、原理概述 质心重合法是将源点云 P P P

MySQL数据库中的视图

视图 ​ 本篇将开始介绍有关数据库中视图的相关知识点,其中主要包含视图的基本使用,视图规则和限制。 ​ 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,视图的数据变化会…

软件测试基础:单元测试与集成测试

单元测试的重要性 单元测试是软件开发过程中的必要步骤。它通过针对软件的最小可测试单元进行测试,可以及早发现代码中的逻辑错误和缺陷。根据统计数据显示,单元测试可以在软件开发初期就发现约70%的错误,从而减少了后期修改的成本和时间消耗…

昆仑通态触摸屏-如何完成几个窗口的切换

一、启动窗口 想要哪一个窗口是启动时第一个显示的,就把谁设置为启动窗口就可以。 二、公共窗口 给一个窗口命名为公共窗口 然后选择一个窗口,将他的公共窗口设置为我们刚才命名的那个窗口 三、页面切换 页面切换,是通过在公共窗口内设置按…

修改elementUI等UI组件样式的5种方法总结,哪些情况需要使用/deep/, :deep()等方式来穿透方法大全

文章目录 方法 1:全局修改样式示例:修改 `ElMessage` 的背景色和字体颜色方法 2:修改特定类型的 `ElMessage` 样式-全局-不需要穿透示例:修改 `ElMessage` 成功类型的样式方法 3:通过 Scoped CSS 在组件内部修改-局部-不需要穿透方法 4:使用 JavaScript 动态修改样式-不需…

SpringBoot中使用SpringTask实现定时任务

SpringBoot默认在无任何第三方依赖的情况下使用spring-context模块下提供的定时任务工具SpringTask。我们只需要使用EnableScheduling注解就可以开启相关的定时任务功能。 定义一个SpringBean,然后定义具体的定时任务逻辑方法并使用Scheduled注解标记该方法即可。…

CTF中的phar反序列化 [SWPU 2018]SimplePHP

以[SWPU 2018]SimplePHP 这道题为例 页面可以查看文件和上传文件 点击查看文件,发现url变成/file.php?file 猜测可能存在文件包含,可以读取文件 尝试读取index.php文件 回显了源码 再读取base.php 只看最后有信息的代码: <!--flag is in f1ag.php--> 提示flag在f1…