计算机组成原理笔记--流水线的扩展(1):数据前推与增加宽度
文章目录
- 前言
- 数据冲突的形式
- 数据前推
- 增加流水线宽度
系列目录
前言
上一讲 简单五级流水线设计与性能 讲到了流水线相比于多周期实现的优势, 同时也提到了流水化带来的3种冲突:控制冲突,数据冲突,结构冲突。这一讲我们主要会关注:
- 数据冲突以及如何降低它的影响。
- 增加流水线宽度以提升指令级并行性(ILP)
这一章及往后将会开始会涉及到乱序执行,长度会较长所以将分成上下两节。
数据冲突的形式
这其实就是数据相关性可能有哪些表现形式,在这里我们用指令编码顺序来命名这些相关性(dependency):
- RAW: 在 Ix 写某寄存器后有指令 Iy 读取该寄存器
如果 Iy 提前执行,Iy会读不到正确数据- WAR: 在 Ix 读某寄存器后有指令 Iy 写该寄存器
如果 Iy 提前执行, Ix 会读不到正确数据- WAW: 在 Ix 写某寄存器后有指令 Iy 写该寄存器
如果 Iy 提前执行执行结束,后面指令不能获得正确数据
例子
指令 | 冲突1 | 冲突2 | 冲突3 | |
---|---|---|---|---|
1 | ADD R1 R2 R3 | WAW with 3 | ||
2 | ADD R4 R1 R5 | RAW with 1 | ||
3 | ADD R1 R5 R3 | WAW with 1 | WAR with 2 |
当然,如果使用之前将的简单五级流水线自然是不会有WAW WAR 这两种相关性的。因为每条指令的执行时间都是5个周期,不可能后面的指令跑到前面去。当我们想要去掉这个限制的时候问题就出来了,我们会在后面一点的地方讨论这两种冲突。
RAW 相关性也叫做真数据相关,是无论如何也避免不了的问题。这种相关性来源于本身代码逻辑上的因果性。虽然这个相关性无法解决,但是可以尽可能的减小它带来的停顿损失:通过数据前推。
数据前推
它的思想很朴素:因为不是所有指令得出结果都需要5个周期,很有可能结果已经算出来但是还没有被写回RF中罢了。我们只需要提供通路,将中间结果引到ID级就可以了。
1 2 3 这些通路同时要提供数据,寄存器地址以及寄存器写使能 3种信号。在ID级中匹配选择地址相同的路径,如果有多个相同地址,选最靠近ID级的数据。注意,对于Load 指令,数据只可能出现于通路2 3。所以RAW并没有完全消除,流水线依然会停顿如果有指令依赖于它的话。
当然,实现数据前推的比较还有一种替代方法。因为所有指令都必然会经过ID级,我们也知道每条指令实际出结果可能在哪一级。我们完全可以在ID级建一个储存结果位置的表:
Reg Address | Time Left To be in Register | |
---|---|---|
1 | R1 | 0 |
2 | R2 | 2 |
3 | R3 | 3 |
… | … | … |
通过Time Left To be in Register 这一项来控制选择前推通路。0代表已经在寄存器了,直接读就好。这个表项具体的实现是使用移位寄存器,而不是直接使用计数器。 如果有指令写比如R2时,R2会重置为3(初始值)。
这种方法最大的问题就是会使用到大量的连接线,而且在ID级的MUX(通路选择)会非常的大。如果有多条流水线,这些线的数量与宽度是很可怕的。
增加流水线宽度
虽然之前讲的5级流水线很简单,效果也还不错,但是我们总想要更高的速度,更好的性能。增加性能的好方法是增加并行性,所以我们想把流水线做宽以便塞进更多执行单元。我们甚至可以把流水线做的不一样长,这样就可以减小数据前推的负担。但是这样一来,指令的顺序就很有可能与编码的时候不一致,而出现乱序执行。同时也出现了新的结构冲突:WB级可能同时需要写回3条指令!!
这很明显代价很大,需要检测的冲突变多了很多。为了解决日益增长的检测负担,我们另加了一级流水线 Issue (I)。 这里将放置我们的冲突检测模块: 计分板(Score Board),同时我们将RF的位置也移动到这一级里。
有人可能会问,假如说一个单发射流水线也有必要这么做吗?毕竟Write Back的时候只能一条一条写回,有必要让运算单元并行吗?我认为是有的,比如说Load/Store指令可能会花相当长的时间来执行(miss)。这时候让其他无关指令同时执行,有利于减小损失,提高CPU利用率。
计算机组成原理笔记--流水线的扩展(1):数据前推与增加宽度相关推荐
- 计算机组成原理笔记--流水线的扩展(2):计分板
文章目录 前言 宽流水线是如何引入问题的 Score Board 结构 如何操作ScoreBoard 总结 系列目录 前言 上一篇文章 我们尝试着将5级流水线扩展以提升性能.首先我们尝试着加入数据前推 ...
- 计算机组成原理笔记之字位扩展
1.字扩展 对于字扩展来说,增加的是存储单元的个数,如何选中某一存储单元是需要考虑的. 解决方法即是将存储单元的地址分为高位地址和低位地址(片内地址). 高位地址(片选信号)由高位地址线和访存信号产生 ...
- 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算1
内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...
- 计算机组成原理笔记(王道考研) 第二章:数据的表示和运算2
内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...
- 24考研王道计算机组成原理笔记
24考研王道计算机组成原理笔记 文章目录 24考研王道计算机组成原理笔记 前言 一.计算机系统概述 1.1 计算机的发展 1.2 计算机硬件 1.2.1 计算机硬件的基本组成 1.2.2 各个硬件的工 ...
- 计算机组成原理笔记(王道考研) 第四章:指令系统
内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...
- 计算机组成原理笔记(王道考研) 第七章:输入输出系统
内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...
- 计算机组成原理笔记(王道考研) 第五章:中央处理器
内容基于中国大学MOOC的2023考研计算机组成原理课程所做的笔记. 感谢LY,他帮我做了一部分笔记.由于听的时间不一样,第四章前的内容看起来可能稍显啰嗦,后面会记得简略一些. 西电的计算机组织与体系 ...
- 计算机组成原理笔记——存储器分类、层次结构、技术指标、存储单元地址分配
计算机组成原理笔记--存储器分类.层次结构.技术指标.存储单元地址分配 一. 概述 存储器的分类 按存储介质划分: (1)半导体存储器 双极型(TTL).MOS (2)磁表面存储器 磁头.载磁体 (3 ...
最新文章
- 专题 11 IPC之管道
- 【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )
- iOS开发多线程篇—多线程简单介绍
- scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解
- mysql 序号_脚本搭建Nginx、Redis、MySql、Maven
- java 性能调优_Java性能调优调查结果(第一部分)
- 赢在CSDN —— 我们一起向前
- Python多进程中多参数问题
- vhg电路是什么意思_值得珍藏的经典模拟电路
- 关于钩子(Hook)的使用
- 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)
- Linux系统下的RZSZ(文件传输工具)
- Java命令注入之防护
- C++轻量级Json解析工具—TinyJson
- Mac安装PL2303驱动
- 按键--找色找图基础
- Linux CentOs7 ping网址 未知的名称或服务
- 计算机相关扩展活动战队名字,2020最新战队名字大全
- GreenPlum中性能调优之shared_buffers修改
- RESTful – 移动互联网时代的高效API架构风格
热门文章
- 再获2亿元A+轮融资,乐生智能能否“扫出”舒适区?
- Ubuntu18 网速显示 插件 显示在状态栏
- 网络栈主要结构介绍(socket、sock、sk_buff,etc)
- iframe标签中写html,html页面中嵌套iframe标签,我们可以用html中的iframe标签搞定
- java模拟抛物线_小tips:用java模拟小球做抛物线运动
- mysql infile ignore_mysql导入数据load data infile用法
- 软件测试工程师岗位个人简历怎么写
- 手把手教你做短视频去水印微信小程序(2-首页)
- 大白话5分钟带你走进人工智能-第七节梯度下降之梯度概念和梯度迭代过程(2)
- python猫眼电影分析_Python数据分析之猫眼电影TOP100