计算机体系结构:Chapter 5 :ILP(指令级并行)

复习:流水线上的实际CPI(平均每条指令使用的周期数),等于理想流水线的CPI加上各类停顿引起的周期数的总和。
C P I 流 水 线 = C P I 结 构 相 关 + C P I 控 制 相 关 + C P I R A W + C P I W A R + C P I W A W CPI_{流水线}=CPI_{结构相关}+CPI_{控制相关}+CPI_{RAW}+CPI_{WAR}+CPI_{WAW} CPI线=CPI+CPI+CPIRAW+CPIWAR+CPIWAW
什么是指令级并行(ILP),以及开发ILP的两种途径
ILP:当指令中不存在相关时,它们在流水线上是可以重叠执行的,我们重叠执行指令以提高性能。而这种指令序列存在的潜在并行性称为指令级并行。
如何开发实现ILP?静态开发(依赖软件)以及动态开发(依赖硬件)
什么是基本块?
基本块(BB):除了出口和入口没有其他分支的线性指令序列
Data Dependence (True dependence), Name Dependence (Anti-dependence, Output dependence) , Control Dependencies 相关(与冲突的关系)
各类相关与冲突的关系:
1、数据相关(Data Dependence):
对于指令i和指令j,如果:
(1)指令j使用指令i的结果
(2)指令j与指令k数据相关,指令k与指令i数据相关,则指令j与指令i之间数据相关。

其中第二点表明,数据相关具有传递性。数据相关是两条指令之间存在一个先读后写的相关链,这个相关链应该贯穿整个程序,是程序的内在特征,也就是说数据相关是程序相关性最本质的相关之一。但这种相关性是导致流水线暂停的原因之一,因为相关的两条指令是不能够重叠执行的。
相关性是程序的特性; 冲突是流水线结构的特性;相关性的存在只预示着存在有冲突的可能性
数据相关的重要性:
(1)确定指令的相关性,找到所有可能产生停顿的地方。预测冲突的可能性。
(2)确定必须严格遵守的数据计算顺序。
(3) 决定可被开发的并行性的上界。
2、名相关
指令使用的寄存器或者存储器称为名。如果两条指令使用的是相同的名,但是他们之间没有数据流,则称之为名相关。
指令j与指令i之间的名相关分为两种:
(1)反相关:指令i先执行,指令j写的是指令i读的名。反相关指令之间的执行顺序是保证的。反相关就是先读后写相关(WAR相关)。
(2)输出相关:指令i和指令j写的是同样的名。输出相关指令之间的执行顺序是不允许颠倒的。输出相关就是写后写相关。(WAW相关)。
解决方式:与数据相关比较,名相关之间的指令没有数据交换。如果一条指令中的名改变了,并不影响另外一条指令的执行,因此可以改变指令中操作数的名来消除名相关,这就是换名技术。对寄存器来说这就是寄存器换名技术。这个过程既可以用编译器静态完成,也可以通过硬件动态完成。
3、控制相关
控制相关是指由分支指令引起的相关,他需要根据分支指令执行的结果来确定后续指令执行的顺序。控制相关与分支成功或分支不成功两个基本程序块的执行有关,典型的程序结构是‘if-then’结构。
控制相关决定了指令执行的顺序。

if p1 {
	S1;
};
if p2 {
	S2;
}

其中S1就和p1控制相关,S2和p2控制相关,S与p1和p2都控制无关。
处理控制相关有以下两个原则:
(1)与控制相关的指令不能移动到分支指令之前,即控制相关的指令不能调度到分支指令控制范围之外。
(2)与控制无关的指令不能移动到分支指令之后,即控制无关的指令不能调度到分支指令控制范围之内。

循环展开(Unrolled Loop and Minimizes Stalls)
实现循环展开的关键是分析清楚代码之间的相关性,然后通过指令调度来消除相关。
详见习题。
动态分支预测
Branch History Table,
通过branch history table。 针对每条跳转指令,branch history table中都会有一条记录与其对应(准确地说,应该是与指令的地址低位相对应,至于是低多少位,则取决于table的大小)。记录的内容就是一个跳转的状态。目前常用两位来表达这个状态。
这种技术感觉对于某些经常跳转或者偶尔才跳转的指令的预测效果相当好。
这也大概是目前所有的计算机体系结构都会提到的一个图。

Correlated Branch Prediction,
在这种策略中,某条指令的跳转不是只由自己来决定的,而是由刚执行过的N条跳转指令的跳转情况来决定的。 这是由于在程序中某条指令跳转与否也与其他的跳转指令相关。所以会利用刚执行完的N条跳转指令来获取跳转信息。 这刚执行完的N条指令的跳转情况组成了一个查询的Key,这个Key值对应的内容就是跳转的状态。状态机同上。
两级预测器的一般表达形式为(m,n)预测器,其含义是根据全局最近的m个分支的行为,来从2^m个n位预测器中做出预测。
m个分支的行为一共有2^m种情况,根据具体情况选择与最近m个分支的行为对应的预测器,该预测器记录的是n位局部分支历史(n和m完全独立)

Tournament Predictor
这种预测技术就是结合以上两种方法,根据跳转指令的低位地址,再加上刚执行完指令的跳转情况来决定下次的跳转情况。它的效果也最好,也是Power5 和 Pentium4使用的技术。
分支目标缓冲
我们将分支成功的分支指令的地址和他的分支目标地址都放到一个缓冲区中保存起来,缓冲区以分支指令的地址作为标示;取指令阶段,所有指令地址都与保存的标示作比较,一旦相同,我们则认定该指令是分支指令。认定他转移成功,并将他的分支目标(下一条指令)的地址就是保存在缓冲区中的分支预测地址。这个缓冲区就是分支预测缓冲区。
计算机体系结构:Chapter 5 :ILP(指令级并行)_第1张图片

动态调度
概念:在流水线中,通过硬件重新安排指令的执行顺序,来调整相关指令执行时的关系,减少处理器空转。
优势:
(1)它可以处理一些编译时未发现的相关。
(2)可以实现在一种流水线上编译的代码也可以在另一条流水线上有效地运行。
(3)简化了编译器。

Scoreboard 记分牌
Tomasulo
Speculation 前瞻执行
Tomasulo with ReOrder Buffer 再定序缓冲

超标量与超长指令字(多指令流出处理器)
超标量:每个时钟流出的指令数不定,它既可以通过编译器静态调度,又可以通过记分牌或者Tomasulo算法动态调度。
超长指令字:每个时钟周期流出的指令数是固定的,它们构成一条长指令,或说是一个混合指令包。这种处理器只能通过静态编译调度。
在理想条件下,超标量处理器将取出两条指令。第一条是整数指令,第二条是浮点数指令,并同时将他们流出。如果这种指令组合存在相关,则将他们流出。
静态超标量处理器将按序执行,而动态超标量处理器使用乱序执行。

超长指令字技术:
超长指令字采用独立的功能部件,但它并不是将多条指令流出到各个功能单元,而是将多条指令的操作组装成固定格式的指令包,形成一条特别长的指令,因此得名。
超长指令字的格式固定,处理过程简单,处理器所需硬件量比超标量处理器要少。

超标量处理器与超长指令字相比有两个优点:
1、超标量结构对程序员来说是透明的,因为处理器能检测下一条指令能否流出,从而不需要排列指令来满足指令流出。
2、即使没有经过编译器对超标量结构进行调度优化的代码或者旧的编译器生成的代码也能运行,但是效果会很差。想要获得好的效果需要使用动态超标量调度技术。

Superscalar VS VLIW:
Superscalar :具有更小的代码大小 ,以及对不同代的硬件的二进制兼容性较为突出
VLIW:简化了用于译码、发布指令的简化用的硬件;
无联锁检测硬件(通过编译器来检查);
更多寄存器,但简化了寄存器端口的硬件(使用了多个独立的寄存器文件)

你可能感兴趣的:(计算机体系结构考试重点)