第4章 指令级并行
计算机系统结构第4章指令级并行及限制
2
4.1.1 指令级并行
1、流水线处理机的实际CPI
– 理想流水线的CPI加上各类停顿的时钟周期数:
CPI流水线 = CPI理想 + 停顿结构冲突 + 停顿数据 冲突 + 停顿控制冲突 – 理想CPI是衡量流水线最高性能的一个指标。 – IPC:Instructions Per Cycle (每个时钟周期完成的指令条数)
24
(1) 展开后没有调度的代码
流出时钟 F0,0(R1) 1 2 F4,F0,F2 3 4 5 0(R1),F4 6 F6,-8(R1) 7 8 F8,F6,F2 9 10 11 -8(R1),F8 12 F10,-16(R1) 13 14 流出时钟 F12,F10,F2 16 17 -16(R1),F12 F14,-24(R1) 19 20 F16,F14,F2 22 23 -24(R1),F16 24 R1,R1,#32 25 26 R1,Loop 27 28
一个元素的操作时间从10个时钟周期减少到6个 5个周期是有指令执行的,1个空转周期。
10
(Ⅱ) (1) 首先,仅仅去除4遍循环体中的分支指令,得到以下 由17条指令构成的指令序列,如下所示:
Loop: LD F0 , 0(R1) ADD.D F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 LD F0 , 0(R1) ADD.D F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 LD F0 , 0(R1) ADD.D F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 LD F0 , 0(R1) ADD.D F4 , F0 , F2 SD 0(R1) , F4 SUBI R1 , R1 , #8 BNEZ R1 , Loop
计算机系统结构 指令级并行 4.3 控制相关的动态解决技术
是
预测成功, 后续指令无 延迟执行
问题:解决预测错误或不命中的延迟。 问题:解决预测错误或不命中的延迟。
4.3 控制相关的动态解决技术
采用BTB BTB技术时指令在各种情况下的延迟 3. 采用BTB技术时指令在各种情况下的延迟 指令在BTB中? 预测结果 实际的动作 是 是 不是 不是 成功 成功 成功 不成功 成功 不成功 延迟周期 0 2 2 0
2/28
4.3 控制相关的动态解决技术
4.3.1 分支预测缓冲
动态分支预测必须解决两个问题: 动态分支预测必须解决两个问题: 两个问题 • 如何记录一个分支操作的历史。 如何记录一个分支操作的历史。 决定预测的走向。 决定预测的走向。 记录分支历史的方法有以下几种: 记录分支历史的方法有以下几种: 仅仅记录最近一次或最近几次的分支历史; ( 1 ) 仅仅记录最近一次或最近几次的分支历史; (2)记录分支成功的目标地址; 记录分支成功的目标地址; (3)记录分支历史和分支目标地址,相当于前 记录分支历史和分支目标地址, 面两种方式的结合; 面两种方式的结合; (4)记录分支目标地址的一条或若干条指令。 记录分支目标地址的一条或若干条指令。
17/28
4.3 控制相关的动态解决技术
BTB命中率 BTB命中率 × 预测错误率 × 2 90% 10% = 90% × 10% × 2 18(时钟周期) = 0.18(时钟周期) 不在BTB BTB中 实际成功,此时的延迟为: (3)不在BTB中,实际成功,此时的延迟为: (1-BTB命中率) × 不在BTB中分支转移成功率 × 2 BTB命中率) 不在BTB中分支转移成功率 命中率 BTB 10% 60% = 10% × 60% × 2 12(时钟周期) = 0.12(时钟周期) 不在BTB BTB中 实际不成功,此时的延迟为0 (4)不在BTB中,实际不成功,此时的延迟为0。
第 4 章 指令级并行
• 解决了结构相关和WAW相关。
2020/8/4
17
• 2.读操作数(Read Operand, 记RO):如果前面 已流出的正在运行的指令不对本指令的源操作数 寄存器进行写操作,或者一个正在工作的功能部 件已经完成了对这个寄存器的写操作,那么此操 作数有效。整个检测工作由记分牌完成。当操作 数有效后,记分牌告诉功能部件读操作数并开始 执行。
硬件+软件技术
必须要硬件技术和软件技术互相 配合,才能够最大限度地挖掘出程 序中存在的指令级并行。
2020/8/4
2
1.流水线处理机的实际CPI
–理想流水线的CPI加上各类停顿的时钟周 期数:
CPI流水线 = CPI理想 + 停顿结构冲突 + 停顿数据冲突 + 停顿控制冲突
– 理想CPI是衡量流水线最高性能的一个指标。 –IPC:Instructions Per Cycle
(每个时钟周期完成的指令条数)
2020/8/4
3
2.基本程序块
– 基本程序块:一段除了入口和出口以外 不包含其他分支的线性代码段。
– 程序平均每5~7条指令就会有一个分支。 循环级并行:使一个循环中的不同循环体 并行执行。 – 开发循环体中存在的并行性
• 最常见、最基本 – 是指令级并行研究的重点之一
2020/8/4
10
流水线动态调度的优点
• (1)能处理某些在编译时无法知道的相 关情况。
• (2)能简化编译程序设计。 • (3)使代码有可移植性。 • 动态调度方法的主要缺点是硬件较为复
汇编_并行计算(指令级)
编译器完成这种指令调度的能力受限于 两个特性:
程序固有的指令级并行性; 流水线功能部件的执行延迟。
第四章 指令级并行
循环展开调度基本方法 – 注意事项
循环展开和指令调度时要注意以下几个方面:
保证正确性。
在循环展开和调度过程中尤其要注意两个地方的正 确性:循环控制,操作数偏移量的修改。
load/store 操作
浮点操作 store 缓冲器 地址部件 load 缓冲器 6 5 4 3 3 2 2 1 1 数据 存储部件 地址 标识 浮点加法器 操作数总线
操作总线
保 留 站
2 1 标识 浮点乘法器
公共数据总线(CDB)
第四章 指令级并行
指令的动态调度 – Tomasulo算法基本思想
IS
检测结构冲突
RO
检测数据冲突
第四章 指令级并行 指令的动态调度
简单的5段流水线中,是不会发生读后写冲突 和写后写冲突的。但乱序执行就使得它们可能 发生了。
例如,考虑下面的代码
存在反相关
DIV.D SUB.D ADD.D
F10, F0, F2 F10, F4, F6 F6, F8, F14
异常处理比较复杂
(精确异常处理、不精确异常处理)
ห้องสมุดไป่ตู้
动态调度要保持正确的异常行为
只有那些在程序严格按程序顺序执行时会发生的异 常,才能真正发生。 保持正确的异常行为:对于一条会产生异常的指令 来说,只有当处理机确切地知道该指令将被执行后 ,才允许它产生异常。
第四章 指令级并行
指令的动态调度 – Tomasulo算法基本思想
archit44
4.3 动态分支预测技术
指令并行
处理器可达到的指令级并行度越高,控制相关 的影响越大 动态解决技术利用硬件对程序运行时分支的行 为进行预测,提前对分支操作做出反应,加快 分支处理的速度。分支预测的效果不仅取决于 其准确性,而且与分支预测时的开销密切相关。 分支转移的最终延迟取决于流水线的结构、预 测的方法和预测错误后恢复所采取的策略 动态分支预测技术要记录分支指令的历史、并 据此决定预测的分支,还要尽快找到分支目标 地址,从而避免控制相关造成流水线停顿
4.4 多指令流出技术
指令并行
将等于1的理想CPI减小,必须实现一个时钟周 期流出(发射issue)多条指令
超标量(Superscalar)处理器:每个时钟周期流出多条 指令(1~8),可以采用编译器进行静态调度顺序执行, 也可以采用硬件动态调度乱序执行 超长指令字(VLIW: Very Long Instruction Word):通 过编译器调度无关的多条指令(4~16)形成一条长指 令,每个时钟周期流出一条长指令 超级流水线(Super pipelining):将每个功能部件进一 步流水化,使得一个功能部件在一个时钟周期中可以处 理多条指令(可以简单地理解为很长的流水线)
WAW 冲突 (输出相关引起) 如果在SUB.D写入F10 之 前 ADD.D 执 行 结 束 , 会出现问题
寄存器换名可以消除WAR和WAW冲突
指令并行
DIV.D F4,F0,F2 SUB.D F10,F4,F6 ADD.D F8,F12,F14
DIV.D F4,F0,F2 SUB.D F10,F4,F6 ADD.D F8,F6,F14
① 根据历史记录(预测位状态)进行分支预测 ② 根据实际分支情况修改预测位
计算机系统结构--《张晨曦、王志英》课后习题参考答案
第1章计算机系统结构的基本概念1.1 解释下列术语层次机构: 按照计算机语言从低级到高级的次序, 把计算机系统按功能划分成多级层次结构, 每一层以一种不同的语言为特征。
这些层次依次为: 微程序机器级, 传统机器语言机器级, 汇编语言机器级, 高级语言机器级, 应用语言机器级等。
虚拟机: 用软件实现的机器。
翻译: 先用转换程序把高一级机器上的程序转换为低一级机器上等效的程序, 然后再在这低一级机器上运行, 实现程序的功能。
解释: 对于高一级机器上的程序中的每一条语句或指令, 都是转去执行低一级机器上的一段等效程序。
执行完后, 再去高一级机器取下一条语句或指令, 再进行解释执行, 如此反复, 直到解释执行完整个程序。
计算机系统结构: 传统机器程序员所看到的计算机属性, 即概念性结构与功能特性。
在计算机技术中, 把这种本来存在的事物或属性, 但从某种角度看又好像不存在的概念称为透明性。
计算机组成: 计算机系统结构的逻辑实现, 包含物理机器级中的数据流和控制流的组成以及逻辑设计等。
计算机实现: 计算机组成的物理实现, 包括处理机、主存等部件的物理结构, 器件的集成度和速度, 模块、插件、底板的划分与连接, 信号传输, 电源、冷却及整机装配技术等。
系统加速比: 对系统中某部分进行改进时, 改进后系统性能提高的倍数。
Amdahl定律: 当对一个系统中的某个部件进行改进后, 所能获得的整个系统性能的提高, 受限于该部件的执行时间占总执行时间的百分比。
程序的局部性原理: 程序执行时所访问的存储器地址不是随机分布的, 而是相对地簇聚。
包括时间局部性和空间局部性。
CPI: 每条指令执行的平均时钟周期数。
测试程序套件: 由各种不同的真实应用程序构成的一组测试程序, 用来测试计算机在各个方面的处理性能。
存储程序计算机: 冯·诺依曼结构计算机。
其基本点是指令驱动。
程序预先存放在计算机存储器中, 机器一旦启动, 就能按照程序指定的逻辑顺序执行这些程序, 自动完成由程序所描述的处理工作。
《计算机系统结构》指令级并行及限制 (2)
3
答案肯定是NO. 因此如果要避免暂停流水线,一个相关指令的执行必须和 被相关的前一条指令的要分开,分开的时钟周期需至少等 于被相关的指令的流水线延迟。
例如: load r1, 100(r2);若顺序执行,则这两条指令之间 必须暂停一个时钟周期。
add r3, r1, 也r4可在这两条指令之间插入一条 非数据相器换名,消除读后写和写后写。
F0、F4:用于展开后的第1个循环体;
F2:保存常数;
F6和F8:用于展开后的第2个循环体; F10和F12:用于第3个循环体;
数据冒险
F14和F16:用于第4个循环体。
Loop:
LD F0 , 0(R1) ADD.D F4 , F0 , F2 SD 0(R1) , F4 LD F0 , -8(R1) ADD.D F4 , F0 , F2 SD -8(R1) , F4 LD F0 , -16(R1) ADD.D F4 , F0 , F2 SD -16(R1) , F4 LD F0 , -24(R1) ADD.D F4 , F0 , F2 SD -24(R1) , F4 SUBI R1 , R1 , #32 BNEZ R1 , Loop
延迟时钟周期数 3
浮点数据存操作(SD)
2
浮点计算
1
浮点数据取操作(LD) 浮点数据存操作(SD)
0
指令流入时钟
Loop: LD F0 , 0(R1) 1
(空转)
2
ADD.D F4 , F0 , F2 3
(空转)
4
(空转)
5
SD 0(R1) , F4 6
SUBI R1 , R1 , #8 7
(空转)
如Intel的Pentium系列采用动态调度;Intel的Itanium( 用于科学领域和特殊应用)采用静态调度。在RISC机器中,指令 系统支持编译优化,其编译器都会采用静态调度方式,有的也同 时采用动态调度。
9--第4章-2-指令级并行-计算机系统结构
分支指令
延迟槽
IF
IS
IF
RF
IS
EX
RF
DF
EX
DS
DF
TC
DS
WB
TC WB
暂停
暂停 分支目标
stall
stall
stall
stall
stall IF
stall
stall IS
stall
stall RF
stall
Stall EX
stall
stall DF
下面讨论的转移目标缓冲技术,当命中缓冲区时可以从缓 冲区直接得到目标地址,而不必等到计算出转移地址。
从简单到复杂的动态转移预测技术如下: 1. 转移预测缓存 2. 分支目标缓冲 3. 基于硬件的前瞻执行 以上预测机制的性能随着复杂性与硬件的增加而有效地提高。 6
1. 转移(分支)预测缓存 (branch prediction buffer,BPB)
最简单的是转移预测缓存区(branch prediction buffer, BPB),也称为转移历史表。可以是指令Cache的一个字段集 合,也可以是一个小存储器。 这个缓存有若干记录表项,最简单的是每个表项1位,记录 转移指令最近一次的分支历史,用转移指令地址低位来索引。 可能有几条转移指令都映射到了同一个预测缓存表项。
因此,前瞻执行阶段以后,需要增加一个指令确认阶段( Instruction commit)。 实现前瞻的关键思想是: 允许指令乱序执行,但必须顺序确认。只有确认以后 的结果才是最终的结果,从而避免不可恢复的行为,如更 新机器状态或执行过程发生异常。
22
再定序缓冲(ReOrder Buffer,ROB): 在指令确认前需要
《指令级并行概念》课件
向更高级别的并行度发展
异构并行计算
利用不同类型的处理器实现并行计算,如GPU、 FPGA等加速器与CPU的混高级别的并行度发展,如线程级并行和 任务级并行。
并行算法和编程模型的研 究
随着并行计算技术的发展,需要研究更高效 的并行算法和编程模型,以充分利用硬件资 源并降低编程难度。
减少内存访问延迟
通过优化内存访问机制, 减少访问延迟,提高处理 器的性能。
支持多种编程模型
为了满足不同应用的需求 ,指令级并行处理器应该 支持多种编程模型,如向 量编程、消息传递接口( MPI)等。
03
指令级并行编程模型
指令级并行编程模型的定义
指令级并行编程模型是一种利用现代处理器指令级并行性的编程模型,旨在提高 程序的执行效率。
并行算法设计
指令级并行也应用于并行算法设计,通过优化算法和数据结构,充 分利用处理器资源,提高算法的执行效率。
02
指令级并行处理器的结构
指令级并行处理器的组成
指令译码单元
将取回的指令进行译码,确定 指令的操作码和操作数。
执行单元
负责执行指令,完成相应的操 作。
指令取指单元
负责从内存中取出指令并存放 到指令缓冲区中。
。
超长指令字(VLIW)处理器
03
将多条指令打包成一个超长指令字,由一个控制器来调度和分
配这些指令到不同的执行单元。
指令级并行处理器的设计思路
充分利用硬件资源
通过并行处理技术,使处 理器能够在同一时间内执 行多个操作,从而提高处 理器的性能。
优化指令调度
根据指令的顺序和依赖关 系,合理地分配和调度指 令,以减少等待和冲突, 提高处理器的效率。
《指令级并行概念》ppt课件
指令级并行的概念
○ 是指令级并行研究 的重点之一。
指令级并行的概念
4.1 指令级并行的概念
最基本的开发循环级并行的技术
指令调度(scheduling)
A
技术 换名(renaming)技术 C
循环展开(loop
B
unrolling)技术
指令级并行 的概念
通过改变指令在程序中的位置,将相关指 ○ 令之间的距离加大到不小于指令执行延迟,将 ● 相关指令转化为无关指令。 ● 指令调度是循环展开的技术基础。
结构有关。 程序中的相关主要有以下三种
• 数据相关 • 名相关 • 控制相关
1.数据相关 (data
dependence)
指令级并行的概 念
0
对于指令i和指令j,如果
1
一.
指令j使用指令i产生的结果,或者
二.
指令j与指令k数据相关,指令k与指令i数据相
○
关,则指令j与指令i数据相关。
○
数据相关具有传递性。
ADDD F16,F14,F2
8
SD 0(R1),F4
SD -8(R1),F8
SUBI R1,R1,#32
12
SD 16(R1),F12
11
BNEZ R1,Loop
SD 8(R1),F16
14
指令 1 2
5 6
9 10
13
4.1 指令级并行的概念
结果分析:
没有数据相关引起的空转等待 整个循环仅仅使用了14个时钟周期
-8(R1),F8 F10,-16(R1) 13
流出时钟
ADDD 15
(空转) 16
(空转) 17
《计算机系统结构》指令级并行及限制 (1)
21
如果分支预测正确则此分支执行完毕。一些机器称这
个过程为完成(Completion或Graduation)。 当预测错误的分支指令到达ROB的出口时,将指出前
➢对于SPEC89基准测试程序,使用有4096个入口的转移 预测缓存会获得82%-99%的准确率。此外,一个有4K个 入口的缓存与一个无限大的缓存相比,在准确率上差 不多。
10
2. 转移目标缓存
为了减小流水线的转移代价,必须确定当前正在译 码的指令是否是转移指令,如果是,那么下一条指令的 地址是什么。如果是转移指令且知道下一条指令的地址, 那么就可以将转移代价降为0。把为转移的后继指令保 存预测地址的转移预测Cache称为转移目标缓存或转移 目标Cache。
通常将指令由前瞻转化为非前瞻这一步骤加到执行阶段 以后,称为指令的确认(Instruction commit)。
实现前瞻的关键思想是:
允许指令乱序执行,但必须顺序确认。只有确认以后的 结果才是最终的结果,从而避免不可恢复的行为,如更新机 器状态或执行过程发生异常。
16
加入前瞻后,需要将指令的执行和指令的确认区分开, 允许指令在确认之前就执行完毕。
➢通常使用2bit预测法来弥补这个缺陷,在这种预测法中,
仅当错误两次时才改变预测方向,图为2bit预测法的有限
状态机。
转移 被选中
转移未 被选中
预测转移被选中 11
转移 被选中
预测转移不被选中 01
转移 被选中
预测转移被选中 10
chap4-2指令级并行
第四章指令级并行刘飞liufeildu@鲁东大学信息与电气工程学院目录1.指令的动态调度2.控制相关的动态解决技术鲁东大学信息与电气工程学院4.2.2 动态调度算法之一:记分牌例:数据先读后写(WAR)相关引起的阻塞代码序列:DIVD F0 , F2 , F4ADDD F10 , F0 , F8SUBD F8 , F8 , F14指令乱序执行时就会出现先读后写相关。
¡记分牌技术的目标:在资源充足时,尽可能早地执行没有数据阻塞的指令,达到每个时钟周期执行一条指令。
鲁东大学信息与电气工程学院¡要发挥指令乱序执行的好处,必须有多条指令同时处于执行阶段,这就要求有多个功能部件或功能部件流水化或者两者兼有。
¡假设:处理器采用多个功能部件。
CDC 6600具有16个功能部件:4个浮点部件,5个存储器访问部件7个整数操作部件在DLX中,假设有2个乘法器、1个加法器、1个除法部件和1个整数部件。
鲁东大学信息与电气工程学院记分牌电路负责记录资源的使用,并负责相关检测,控制指令的流出和执行。
2.每条指令在流水线中的执行过程分为四段:(1) 流出(Issue,记为IS)如果本指令所需的功能部件有空闲,并且其它正在执行的指令使用的目的寄存器与本指令的不同,记分牌就向功能部件流出本指令,并修改记分牌内部的数据记录。
解决了指令间存在的结构相关或写后写相关。
鲁东大学信息与电气工程学院(2) 读操作数(Read Operand,记为RO)。
记分牌需要监测源操作数寄存器中数据的有效性,如果前面已流出的还在运行的指令不对本指令的源操作数寄存器进行写操作,或者一个正在工作的功能部件已经完成了对这个寄存器的写操作,那么此操作数有效。
当操作数有效后,记分牌将启动本指令的功能部件读操作数并开始执行。
解决了数据的先写后读(RAW)相关。
通过以上步骤,记分牌动态解决了结构相关和数据相关引发的阻塞,指令可能乱序流出。
计算机系统结构 指令级并行 4.2 指令的动态调度
27/61
4.2 指令的动态调度
4.2.3 动态调度算法之二:Tomasulo算法
Tomasulo算法将记分牌的关键部分和寄存器换名 技术结合在一起。
基本核心:通过寄存器换名来消除写后写和先读 后写相关而可能引发的流水线阻塞。
√
√ √ √ √
√
√ √ √
√
√ √ √
√
√
18/61
功能部件状态表
部件名称
整数
Busy Op Fi Fj Fk Qj
no
Qk Rj Rk
no no
乘法1
乘法2 加法 除法
yes MULTD F0 F2 F4
no yes ADDD yes DIVD F6 F8 F2 F6 乘法1
no no
no yes
22/61
4.2 指令的动态调度
流出(IS) (1) 进入条件 not Busy(FU) and not result(’D’); //判断结构阻塞和写后写 (2) 计分牌记录内容 Busy(FU)←yes; OP(FU)←Op; Fi(FU)←’D’; Fj(FU)←’S1’; Fk(FU)←’S2’;
26/61
4.2 指令的动态调度
6. 记分牌的性能受限于以下几个方面: (1) 程序指令中可开发的并行性,即是否存在 可以并行执行的不相关的指令。 (2) 记分牌容量。记分牌的容量决定了流水线 能在多大范围内寻找不相关指令。 流水线中可以同时容纳的指令数量又 称为指令窗口。 (3) 功能部件的数目和种类。功能部件的总数 决定了结构冲突的严重程度。 (4) 反相关和输出相关。引起计分牌中先读后 写和写后写阻塞。
CDC 6600具有16个功能部件:
计算机体系结构张晨曦版本第四章解答-new
第四章习题四4.1解释下列术语:指令级并行:指令序列中存在的潜在的并行性称为指令级并行。
指令调度:指令调度是一种用以避免冲突的方法,但并不改变相关。
通过改变指令在程序中的位置,将相关指令间的距离加大到不小于指令执行延迟的时钟数,以此消除相关指令造成的流水线冲突。
指令的动态调度:在程序执行过程中,依靠专门的硬件对代码进行调度,重新安排指令的执行顺序,来调整相关指令实际执行时的关系,减少可能的冲突。
指令的静态调度:在程序的编译期间,由编译器进行代码调度和优化,重新安排指令的执行顺序,把相关的指令拉开距离,以减少可能产生的冲突。
保留站:在Tomasulo算法实现结构中,保留站设置在运算部件的入口,每个保留站中保存一条已经流出并等待到本功能部件执行的指令的相关信息,包括操作码、操作数以及用于检测和解决冲突的信息。
在一条指令流出到保留站的时候,如果该指令的操作数已经在寄存器中就绪,则将之取到该保留站中。
如果操作数还没有计算出来,则在该保留站中记录将产生这个操作数的保留站的标识。
CDB:公共数据总线,是Tomasulo算法实现结构中的一条重要的数据通路,所有功能部件的计算结果都要送到CDB上,由它把这些结果直接送到各个需要该结果的地方。
动态分支预测技术:用硬件动态地进行分支处理的方法。
这些方法是在程序运行时,根据分支指令过去的表现来预测其将来的行为。
如果分支行为发生了变化,预测结果也随之改变。
其目的有两个:预测分支是否成功和尽快找到分支目标地址(或指令),从而避免控制相关造成流水线停顿。
BHT:分支历史表,也称之为分支预测缓冲器,用来记录分支指令最近一次或几次的执行情况(成功或不成功),并根据此进行预测。
分支目标缓冲:将分支成功的分支指令的地址和它的分支目标地址都放到一个缓冲区中保存起来,缓冲区以分支指令的地址作为标识,取指令阶段,所有指令地址都与保存的标示作比较,一旦相同,就认为本指令是分支指令,且认为它转移成功,并且它的分支目标地址就是保存在缓冲区的分支目标地址。
计算机体系结构第2版课件第4章 第5讲
FPS-164是较新的机器,它的每个指令字含有 对应于10个不同功能单元的10条指令
VLIW基本机构
VLIW采用多个独立的功能单元,多个不同 的操作封装在一条长指令字中,每个功能单 元在VLIW指令中都有一定的对应区域
在超标量流水线上对上述代码进行调度,以 获取更多地指令机并行度
Loop:
整数指令
LD LD LD LD LD SD SD SD SD SUBI BNEZ SD
F0(R1) F6,-8(R1) F10,-16(R1) F14,-24(R1) F18,-32(R1) 0(R1),F4 -8(R1),F8 -16(R1),F12 -24(R1),F16 R1,R1,#40 R1,Loop -32(R1),F20
Mem Ref2 L.D F6,-8(R1)
FP1
ADD.D F4,F0,F2 ADD.D F12,F10,F2
FP2 ADD.D F8,F6,F2
S.D F4,24(R1) S.D F12,8(R1)
S.D F8,16(R1)
Int/branch
DADDUI R1,R1,#-24 BNE R1,R2,Loop
一般每个功能单元占用16-24位 例如:2个整数、2个浮点、2个访存、1个分支
,则该指令的长度为112-168位
VLIW硬件只是简单地将指令字中对应的部 分送给各个功能单元,功能单元在哪一个时 钟周期执行什么操作由编译器来确定
如果某个功能单元在某个周期没有任务,则执行 NOP指令
VLIW例子
Int/branch DADDUI R1,R1,#-80 BNE R1,R2,Loop
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/3/3
21
浮点流水线延迟
产生结果的指令 使用结果的指令 延迟(时钟周期数)
浮点计算
另一个浮点计算
3
浮点计算 浮点store(S.D)
2
浮点load(L.D) 浮点计算
1
浮点load(L.D) 浮点store(S.D)
0
Load指令的结果可以通过定向路径及时送给store指 令,所以延迟为0,不用插入停顿。
6
DADDIU R1,R1,#-8
7
(空转)
8
BNE R1,R2,Loop
9
(空转)
10
每个元素的操作需要10个时钟周期,其中5个是空 转周期。
2020/3/3
25
指令调度以后,程序的执行情况
Loop: L.D F0,0(R1) (空转) ADD.D F4,F0,F2 (空转) (空转) S.D F4, 0(R1)
硬件方法:指令的动态调度、动态分支预测、 多指令流出技术。
软件方法:指令的静态调度、循环展开技术。 软硬件结合方法:显式并行指令计算EPIC。
2020/3/3
19
4.5 循环展开和指令调度
4.5.1 循环展开和指令调度的基本方法
为了充分发挥流水线的作用,必须设法让它满 负荷工作。因此要充分开发指令之间存在的并 行性,找出不相关的指令序列,让它们在流水 线上重叠并行执行。
2020/3/3
22
例4.6 对于下面的源代码,转换成MIPS汇编语言, 在不进行指令调度和进行指令调度两种情况下, 分析其代码一次循环所需的执行时间。
for (i=1; i<=1000; i++)
x[i] = x[i] + s;
解:
该循环的不同迭代之间不存在相关,所以多次迭 代可以并行执行。
在每一次循环的内部,没有任何的并行性。 每一次循环都可以与其他的循环重叠并行执
行。 开发循环级并行性是增加指令之间并行性的最
简单和最常用的方法。
2020/3/3
7
开发循环级并行的基本技术
采用循环展开技术 采用向量指令和向量数据表示
2020/3/3
8
(2)解决相关与流水线冲突问题
相关是程序固有的一种属性,它反映了程序中 指令之间的相互依赖关系。
如果能做到保持程序的数据相关和控制相关, 就能保持程序的数据流和异常行为。
2020/3/3
13
例:
DADDU R2,R3,R4
BEQZ R2,L1
LW
R1,0(R2)
L1 :
如果不保持关于R2的数据相关,程序的执行结果 就会改变。
如果不保持控制相关,把LW指令移到BEQZ之前, 就有可能产生一个新的“访存保护”异常(如果 R2=0)。
②通过代码变换,消除相关。
2020/3/3
11
解决相关与冲突时需注意的问题
由于相关的存在,在开发指令级并行时,如果 可能影响到程序的正确性,就必须注意保持程 序顺序。
程序顺序:由源程序确定的在完全串行方式 下指令的执行顺序。
控制相关并不是一个必须严格保持的关键属性。
当存在控制相关时,在对程序的正确性没有 影响的前提下,可以不遵守控制相关的依赖 关系,执行本来不该执行的指令。
2020/3/3
12
必须保持的最关键的两个属性
要正确地执行程序,必须保持的最关键的两个 属性是:数据流和异常行为。
保持异常行为:无论怎么改变指令的执行顺序, 都不能改变程序中异常的发生情况。
原来程序中是怎么发生的,改变执行顺序后 还是怎么发生。
可弱化为:指令执行顺序的改变不能导致程 序中发生新的异常。
2020/3/3
4
IPC(Instructions Per Cycle )
IPC:每个时钟周期内完成的指令条数。 IPC是CPI的倒数。 提高IPC的途径之一是减少CPI流水线 。
2020/3/3
5
2. 基本程序块
基本程序块:一段除了入口和出口以外不 包含其他分支的一个线性代码段。
因为程序往往平均每5~7条指令就会有一 个分支,而且指令之间还可能存在相关, 所以在基本程序块中能开发的并行性是很 有限的,很可能比基本块的大小要小很多。
3
(空转)
4
(空转)
5
S.D F4, 0(R1) 6
L.D F6,-8(R1)
7
(空转)
8
ADD.D F8,F6,F2
9
(空转)
10
(空转)
11
S.D F8, -8(R1) 12
L.D F10,-16(R1) 13
(空F10,F2 15
(空转)
16
(空转)
17
2020/3/3
15
例:
DADDU R1,R2,R3 BEQZ R4,L1 DSUBU R1,R5,R6 L1 :… OR R7,R1,R8
OR指令中使用的R1值取决于BEQZ指令分支的 是否成功。即OR与DADDU或DSUBU指令相关。
必须通过保持控制相关,避免对数据流的修改, 以保证数据流的正确。
LOGO
第4章 指令级并行
主讲: 顾一禾
2020/3/3
顾一禾 制作 2013 第5版
本章学习内容
指令级并行的基本概念 指令的动态调度 动态分支预测技术 多指令流出技术
2020/3/3
2
4.1 指令级并行
指令之间存在的潜在并行性称为指令级并 行。(ILP:Instruction-Level Parallelism)
相关的三种类型:数据相关、名相关、控制相 关。
如果两条指令相关,它们就不能并行执行,或 只能部分重叠执行。
由于相关的存在,使得指令流中的下一条指令 不能在指定时钟周期执行,就是发生了流水线 冲突。
相关的存在限制了指令级并行(ILP)的开发。
2020/3/3
9
流水线冲突的三种类型:结构冲突、数据冲突、 控制冲突。
2020/3/3
23
MIPS汇编语言代码:
假设R1的初值指向第一个元素,8(R2)指向最 后一个元素。
Loop:L.D F0,0(R1) //取一个向量元素放入F0
ADD.D F4,F0,F2 //加上在F2中的标量
S.D
F4, 0(R1) //存结果
DADDIU R1,R1, #-8 //将指针减8(每个数据占8个字节) BNE R1,R2,Loop //若R1不等于R2,表示尚未结束,
2020/3/3
27
例子中的问题及解决方案
只有L.D、ADD.D和S.D这3条指令是有效 操作,占用3个时钟周期。而DADDIU、 空转和BEN这3个时钟周期都是附加的循 环控制开销。有效操作比例不高。
循环展开技术
把循环体的代码复制多次并按顺序排列, 然后相应调整循环的结束条件。
2020/3/3
为了明显地提高性能,必须跨越多个基本 块开发指令的并行性。
2020/3/3
6
3. 开发指令级并行常用的方法
(1)开发循环级并行
循环级并行(Loop-level parallelism): 循环程序不同迭代之间存在的并行性。
例: for (i=1; i≤500; i=i+1) a[i]=a[i]+s;
F0、F4:用于展开后的第1个循环体 F2:用于保存常数 F6、F8:用于展开后的第2个循环体 F10、F12:用于展开后的第3个循环体 F14、F16:用于展开后的第4个循环体
2020/3/3
30
展开后没有调度的代码
Loop:
指令流出时钟
L.D F0,0(R1)
1
(空转)
2
ADD.D F4,F0,F2
结构冲突:由硬件资源冲突造成。
数据冲突:由数据相关和名相关造成。
控制冲突:由控制相关造成。
具体的一次相关是否会导致实际冲突的发生以 及该冲突会带来多长的停顿,根据流水线的属 性而定。
2020/3/3
10
解决相关与冲突的方法
① 保持相关,但避免发生冲突。 方法:指令调度,包括静态调度和动态调度。
28
例4.7 将例4.6中的循环展开3次得到4个循环体, 然后对展开后的指令序列在不调度和调度两种 情况下,分析代码的性能。
设R1的初值为32的倍数,即循环次数为4的倍 数。因此不需要在循环体后面增加补偿代码。
方法:消除冗余的指令,并且不重复使用寄存 器。
2020/3/3
29
分配寄存器(不重复使用寄存器 )
★DSUBU不能被移到BEQZ之前。
2020/3/3
16
有时,不遵守控制相关既不影响异常行为, 也不改变数据流。在这种情况下,可以大胆 地进行指令调度,把失败分支中的指令调度 到分支指令之前。
2020/3/3
17
例: DADDU BEQZ DSUBU DADDU
Skipnext: OR
增加指令间并行性最简单和最常用的方法
开发循环级并行性—循环的不同迭代之间存 在的并行性。
在把循环展开后,通过重命名和指令调度来 开发更多的并行性。
2020/3/3
20
编译器指令调度能力的限制
编译器完成指令调度的能力受限于两个特性: 程序固有的指令级并行性; 流水线功能部件的执行延迟。
2020/3/3
32
对指令序列进行优化调度
Loop: L.D
L.D
L.D
L.D
ADD.D
ADD.D
ADD.D
ADD.D
S.D
S.D
DADDIU