计算机体系结构 第5章 指令级并行及其开发—硬件方法(3)
文章目录
- 第5章 指令级并行及其开发—硬件方法
- 5.5 多指令流出技术
- 5.5.1 基础内容
- 5.5.1 基于静态调度的多流出技术
- 5.5.2 基于动态调度的多流出技术
- 5.5.3 超长指令字技术
- 5.5.4 多流出处理器受到的限制
- 5.5.5 超流水线处理机
第5章 指令级并行及其开发—硬件方法
5.5 多指令流出技术
5.5.1 基础内容
在每个时钟周期内流出多条指令,
CPI<1
。
单流出和多流出处理机执行指令的时空图对比
多流出处理机有两种基本风格:
- 超标量(Superscalar)
- 超长指令字
VLIW
超标量
- 在每个时钟周期流出的指令条数不固定,依代码的具体情况而定。(有个上限)
- 设这个上限为
n
,就称该处理机为n-
流出。 - 可以通过编译器进行静态调度,也可以基于Tomasulo算法进行动态调度。
超长指令字VLIW
(Very Long Instruction Word)
- 在每个时钟周期流出的指令条数是固定的,这些指令构成一条长指令或者一个指令包。
- 指令包中,指令之间的并行性是通过指令显式地表示出来的。
- 指令调度是由编译器静态完成的。
超标量处理机与VLIW处理机相比有两个优点:
- 超标量结构对程序员是透明的,处理机能自己检测下一条指令能否流出,不需要由编译器或专门的变换程序对程序中的指令进行重新排列;
- 即使是没有经过编译器针对超标量结构进行调度优化的代码或是旧的编译器生成的代码也可以运行,当然运行的效果不会很好。
要想达到很好的效果,方法之一:使用动态超标量调度技术。
各种多流出技术的特点以及采用这些技术的处理机
技术 | 流出结构 | 冲突检测 | 调度 | 主要特点 | 处理机实例 |
---|---|---|---|---|---|
超标量(静态) | 动态 | 硬件 | 静态 | 按序执行 | Sun UltraSPARCⅡ/Ⅲ |
超标量(动态) | 动态 | 硬件 | 动态 | 部分乱序执行 | IBM Power2 |
超标量(猜测) | 动态 | 硬件 | 带有前瞻的动态调度 | 带有前瞻的乱序执行 | Pentium Ⅲ/4, MIPS R10K, Alpha 21264, HP PA 8500, IBM RS64Ⅲ |
VLIW/LIW | 静态 | 硬件 | 静态 | 流出包之间没有冲突 | Trimedia,i860 |
EPIC | 主要静态 | 主要软件 | 主要静态 | 相关性被编译器显式地标记出来 | Itanium |
5.5.1 基于静态调度的多流出技术
静态调度
是指:
- 在典型的超标量处理器中,每个时钟周期可流出1到8条指令(实际上很难达到8条)。
- 指令按序流出,在流出时进行冲突检测。
- 由硬件检测
当前流出的指令之间
是否存在冲突以及当前流出的指令与正在执行的指令
是否有冲突。
- 由硬件检测
举例:一个4-
流出的静态调度超标量处理机
在取指令阶段,流水线将从取指令部件收到
1~4
条指令(称为流出包)。- 在一个时钟周期内,这些指令有可能是全部都能流出,也可能是只有一部分能流出。
流出部件检测结构冲突或者数据冲突。
- 一般分两阶段实现:
- 第一段:进行流出包内的冲突检测,选出初步判定可以流出的指令;
- 第二段:检测所选出的指令与正在执行的指令是否有冲突。
MIPS处理机
是怎样实现超标量
假设:每个时钟周期流出两条指令:
- 1条整数型指令+1条浮点操作指令
- 其中:把load指令、store指令、分支指令归类为整数型指令。
要求:
- 同时取两条指令(64位),译码两条指令(64位)。
对指令的处理包括以下步骤:
- 从
Cache
中取两条指令; - 确定哪几条指令可以流出(0~2条指令);
- 把它们发送到相应的功能部件。
- 从
双流出超标量流水线中指令执行的时空图
- 假设:所有的浮点指令都是加法指令,其执行时间为两个时钟周期。
- 为简单起见,图中总是把整数指令放在浮点指令的前面。
指令类型\流水线工作情况 | ||||||||
---|---|---|---|---|---|---|---|---|
整数指令 | IF | ID | EX | MEM | WB | |||
浮点指令 | IF | ID | EX | EX | MEM | WB | ||
整数指令 | IF | ID | EX | MEM | WB | |||
浮点指令 | IF | ID | EX | EX | MEM | WB | ||
整数指令 | IF | ID | EX | MEM | WB | |||
浮点指令 | IF | ID | EX | EX | MEM | WB | ||
整数指令 | IF | ID | EX | MEM | WB | |||
浮点指令 | IF | ID | EX | EX | MEM |
说明:
- 采用“
1条整数型指令+1条浮点指令
”并行流出的方式,需要增加的硬件很少。 - 浮点load或浮点store指令将使用整数部件,会增加对浮点寄存器的访问冲突。(因为这些指令被当作整数型指令)
- 解决方法:增设一个浮点寄存器的读/写端口。
- 采用“
限制超标量流水线的性能发挥的障碍
load指令
- load后续3条指令都不能使用其结果,否则就会引起停顿。
分支延迟
如果分支指令是流出包中的第一条指令,则其延迟是3个时钟周期;
否则就是流出包中的第二条指令,其延迟就是两个时钟周期。
如下图所示
5.5.2 基于动态调度的多流出技术
扩展Tomasulo算法:支持双流出超标量流水线
- 每个时钟周期流出两条指令;
- 一条是整数指令,另一条是浮点指令。
采用一种比较简单的方法:
- 指令按顺序流向保留站,否则会破坏程序语义。
- 将整数所用的表结构与浮点用的表结构分离开,分别进行处理,这样就可以同时地流出一条浮点指令和一条整数指令到各自的保留站。
有两种不同的方法可以实现多流出
- 关键在于:对保留站的分配和对流水线控制表格的修改。
- 在半个时钟周期里完成流出步骤,这样一个时钟周期就能处理两条指令。
- 设置一次能同时处理两条指令的逻辑电路。
现代的流出4条或4条以上指令的超标量处理机经常是两种方法都采用。
例5.5 对于采用了Tomasulo算法和多流出技术的MIPS流水线,考虑以下简单循环的执行。该程序把
F2
中的标量加到一个向量的每个元素上。
Loop: L.D F0, 0(R1) // 取一个数组元素放入F0ADD.D F4, F0, F2 // 加上在F2中的标量S.D F4, 0(R1) // 存结果DADDIU R1,R1,#-8 // 将指针减少8(每个数据占8个字节)BNE R1,R2,Loop // 若R1不等于R2,表示尚未结束,转移到Loop继续。
现做以下假设:
- 每个时钟周期能流出一条整数指令和一条浮点指令,即使它们相关也是如此。
- 有一个整数部件,用于
整数ALU运算和地址计算
;并且对于每一种浮点操作类型都有一个独立的流水化了的浮点功能部件。 指令流出和写结果
各占用一个时钟周期。- 具有动态分支预测部件和一个独立的计算分支条件的功能部件。
- 跟大多数动态调度处理器一样,写回段的存在意味着实际的指令延迟会比按序流动的简单流水线多一个时钟周期。 所以,从产生结果数据的源指令到使用该结果数据的指令之间的延迟为:整数运算一个周期,load两个周期,浮点加法运算3个周期。
问题:
请列出该程序前面3遍循环中各条指令的流出、开始执行和将结果写到CDB上的时间。
- 如果分支指令单流出,没有采用延迟分支,但分支预测是完美的。请列出整数部件、浮点部件、数据Cache以及CDB的资源使用情况。
解:执行时,该循环将动态展开,并且只要可能就流出两条指令。
下表中列出了各指令执行到几个操作点的时间及资源的使用情况。
遍数 | 指令 | 流出 | 执行 | 访存 | 写CDB | 说明 |
---|---|---|---|---|---|---|
1 |
L.D F0, 0(R1)
|
1 | 2 | 3 | 4 | 流出第一条指令 |
1 |
ADD.D F4, F0, F2
|
1 | 5 | 8 | 等待L.D的结果 | |
1 |
S.D F4, 0(R1)
|
2 | 3 | 9 | 等待ADD.D的结果 | |
1 |
DADDIU R1,R1,#-8
|
2 | 4 | 5 | 等待ALU | |
1 |
BNE R1,R2,Loop
|
3 | 6 | 等待DADDIU的结果 | ||
2 |
L.D F0, 0(R1)
|
4 | 7 | 8 | 9 | 等待BNE完成 |
2 |
ADD.D F4, F0, F2
|
4 | 10 | 13 | 等待L.D的结果 | |
2 |
S.D F4, 0(R1)
|
5 | 8 | 14 | 等待ADD.D的结果 | |
2 |
DADDIU R1,R1,#-8
|
5 | 9 | 10 | 等待ALU | |
2 |
BNE R1,R2,Loop
|
6 | 11 | 等待DADDIU的结果 | ||
3 |
L.D F0, 0(R1)
|
7 | 12 | 13 | 14 | 等待BNE完成 |
3 |
ADD.D F4, F0, F2
|
7 | 15 | 18 | 等待L.D的结果 | |
3 |
S.D F4, 0(R1)
|
8 | 13 | 19 | 等待ADD.D的结果 | |
3 |
DADDIU R1,R1,#-8
|
8 | 14 | 15 | 等待ALU | |
3 |
BNE R1,R2,Loop
|
9 | 16 | 等待DADDIU的结果 | ||
4 |
L.D F0, 0(R1)
|
10 | 17 | 18 | 19 | 等待BNE完成 |
4 |
ADD.D F4, F0, F2
|
10 | 20 | 23 | 等待L.D的结果 | |
4 |
S.D F4, 0(R1)
|
11 | 18 | 24 | 等待ADD.D的结果 | |
4 |
DADDIU R1,R1,#-8
|
11 | 19 | 20 | 等待ALU | |
4 |
BNE R1,R2,Loop
|
12 | 21 | 等待DADDIU的结果 |
注:
- R是整数寄存器,F是浮点寄存器,分别指出不同的操作
- 对于load和store,在执行段进行有效地址的计算(因此DADDIU在S.D执行段后就可以修改R1寄存器)
- 下一个循环的L.D指令比当前循环的store指令先访问寄存器
- 流出周期是每两条一个周期,分支指令单独一个周期
- 循环第二轮后,流出 执行 访存 写CDB段的执行周期,只需要在
第一轮循环
的基础上加5
就可以求出
资源使用情况如下表所示:
时钟周期 | 整型ALU | 浮点ALU | 数据Cache | CDB |
---|---|---|---|---|
2 | 1/L.D | |||
3 | 1/S.D | 1/L.D | ||
4 | 1/DADDIU | 1/L.D | ||
5 | 1/ADD.D | 1/DADDIU | ||
6 | ||||
7 | 2/L.D | |||
8 | 2/S.D | 2/L.D | 1/ADD.D | |
9 | 2/DADDIU | 1/S.D | 2/L.D | |
10 | 2/ADD.D | 2/DADDIU | ||
11 | ||||
12 | 3/L.D | |||
13 | 3/S.D | 3/L.D | 2/ADD.D | |
14 | 3/DADDIU | 2/S.D | 3/L.D | |
15 | 3/ADD.D | 3/DADDIU | ||
16 | ||||
17 | ||||
18 | 3/ADD.D | |||
19 | 3/S.D |
可以看出:
每3个时钟周期就执行一个新循环,每个循环5条指令。
IPC=5/3=1.67条/拍
虽然指令的流出率比较高,但是执行效率并不是很高。
- 16拍共执行15条指令,
- 平均指令执行速度为15/16=0.94条/拍。
- 原因是浮点运算少,ALU部件成了瓶颈。
解决方法:增加一个加法器,把ALU功能和地址运算功能分开。
上述双流出动态调度流水线的性能受限
于以下3个因素:
- 整数部件和浮点部件的工作负载不平衡,没有充分发挥出浮点部件的作用。
- 应该设法减少循环中整数型指令的数量。
- 每个循环叠代中的控制开销太大。
- 5条指令中有两条指令是辅助指令;
- 应该设法减少或消除这些指令。
- 控制相关使得处理机必须等到分支指令的结果出来后才能开始下一条L.D指令的执行。
5.5.3 超长指令字技术
- 把能并行执行的多条指令组装成一条很长的指令;(100多位到几百位)
- 设置多个功能部件;
- 指令字被分割成一些字段,每个字段称为一个
操作槽
,直接独立地控制一个功能部件; - 在VLIW处理机中,在指令流出时不需要进行复杂的冲突检测,而是依靠编译器全部安排好了。
VLIW存在的问题:
程序代码长度增加了
- 提高并行性而进行的大量的循环展开;
- 指令字中的操作槽并非总能填满。
- 解决:采用指令共享立即数字段的方法,或者采用指令压缩存储-调入Cache或译码时展开的方法。
采用了锁步机制
- 任何一个操作部件出现停顿时,整个处理机都要停顿。因为所有部件都是同步的。
- 在最新的VLIW处理器,各个功能部件尽可能多的独立,通过硬件检测机制允许指令非同步执行。
机器代码的不兼容性,程序移植困难。
5.5.4 多流出处理器受到的限制
主要受以下3个方面的限制:
- 程序所固有的指令级并行性;
- 是最根本原因
- 硬件实现上的困难;
- 超标量和超长指令字处理器固有的技术限制。
结论:
- 现存的多数超标量处理器,它们将编译器的静态调度和硬件的动态度机制结合起来,共同决定可同时并行流出的指令数。
- 设计多流出处理器的主要难点是:访存的开销、硬件的复杂性和编译器技术的难度,各个因素的权衡和技术的取舍,取决于设计人员认为它对性能有多大影响。
5.5.5 超流水线处理机
超流水线处理机的定义:
- 将每个流水段进一步细分,这样在一个时钟周期内能够分时流出多条指令。
- 对于一台每个时钟周期能流出
n
条指令的超流水线计算机来说,这n条指令不是同时流出的,而是每隔1/n
个时钟周期流出一条指令。 - 实际上该超流水线计算机的流水线周期为1/n个时钟周期。
一台每个时钟周期分时流出两条指令的超流水线计算机的时空图如下:
计算机体系结构 第5章 指令级并行及其开发—硬件方法(3)相关推荐
- subd计算机系统结构,计算机体系结构第2章试题答案.doc
计算机体系结构第2章试题答案.doc (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 一 填空题1.堆栈型 通用寄存器型2.累加器型 ...
- 计算机体系结构 第1-2章 量化设计与分析基础/指令系统原理与示例
第1章 量化设计与分析基础 计算机的分类类别 计算机系统结构定义和计算机的设计任务:指令集结构概念及要素 实现技术的趋势:技术发展的趋势 集成电路功耗的趋势:功耗的概念 可靠性:提高可靠性的方法 6. ...
- 计算机体系结构 第7章 存储系统(2)
文章目录 第7章 存储系统 7.2 Cache基本知识 7.2.1 基本结构和原理 7.2.2 映象规则 7.2.3 查找方法 7.2.4 替换算法 7.2.5 写策略 7.2.6 Cache的性能分 ...
- 计算机体系结构 第2章 指令系统的设计(1)
文章目录 第2章 指令系统的设计 2. 1 指令系统结构的分类 2.1.1 指令系统结构的主要分类 2.1.2 通用寄存器型结构 2.2 寻址方式 2.2.1 寻址方式的定义 2.2.2 立即数寻址方 ...
- 计算机体系结构 第7章 存储系统(6)
文章目录 第7章 存储系统 7.6 并行主存系统 7.6.0 基本概念 7.6.1 单体多字存储器 7.6.2 多体交叉存储器 7.6.2.1 高位交叉编址 7.6.2.2 低位交叉编址 7.6.3 ...
- 计算机体系结构 第3章 流水线技术(1)
文章目录 第3章 流水线技术 3.1 流水线的基本概念 3.1.1 流水线的基本概念 3.1.2 流水线的分类 3.2 流水线的性能指标 3.2.1 吞吐率 各段时间均相等的流水线 各段时间不完全相等 ...
- 计算机体系结构 第七章 网络
网络 7 Net 7.1 互联网络基本概念 7.1.1 互连网络的作用 7.1.2 互联函数 7.1.3 互联网络的特性 7.1.4 互联网络的传输性能参数 7.2 互连网络的分类 7.3 静态链接网 ...
- 计算机体系结构 第三章 流水线(Pipeline)技术
1.流水线技术简介 2.指令流水 3.浮点加法流水 4.流水技术 5.流水线的分类 部件功能级.处理机级和处理机间级流水线 部件功能级流水就是将复杂的算术逻辑运算组成流水线工作方式.例如,可将浮点加法 ...
- 计算机结构体系ppt,计算机体系结构-浙江大学课件.ppt
<计算机体系结构-浙江大学课件.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<计算机体系结构-浙江大学课件.ppt>文档请在天天文库搜索. 1. ...
最新文章
- PHP代码静态分析工具PHPStan
- python元类、反射及双线方法
- 误删了microsoft visual c++后如何正常运行matlab
- 无线数传电台工业控制的应用
- 数学怪兽-法国数学家庞加莱
- python装饰器应用论文_python 装饰器应用
- 火狐浏览器linux最新版本下载,Firefox9 for Linux下载
- python的调试器_玩转Python调试器
- centos 7首次登录和常见命令
- JavaScript正则表达式使用详解
- 别人加薪你加班,征服老板才是王道
- C#保存CookieContainer到文件
- 五个问答告诉你:阿里云对象存储如何助力钉钉战胜业务洪峰
- 计算机酷我音乐文件夹,酷我音乐缓存文件在哪?打开酷我音乐缓存文件的方法...
- 武汉大学计算机学院2015级,武汉大学研究生课程-数据挖掘-2015级研究生试题.doc...
- 原来js让任务栏闪烁这么简单
- 计算机科学技术学院迎新晚会主题,计算机科学与技术学院2019迎新晚会圆满落幕...
- Python——第五天Beer
- Android中实现红绿灯动画,android红绿灯制作
- php 文字转unicode,php汉字如何转unicode