Atiitt 流水线停顿问题

Atiitt 流水线停顿问题与解决方法

2018-10-11
10次浏览

Atiitt 流水线停顿问题与解决方法

 

1. 流水线技术方式分类 1

2. 但在实际中,会出现2种情况使流水线停顿下来或不能启动: 2

2.1. 1、多个任务在同一时间周期内争用同一个流水段 2

2.2. 数据依赖。 2

3. 处理器流水线中的冲突 2

3.1. 7.1 流水线中的资源冲突 2

3.2. 7.2 流水线中的数据冲突 3

4. 为了能够尽可能的减少流水线停顿带来的性能损失,可以使用“动态调度”的方法 3

 

 

1. 流水线技术方式分类

3、按连接的方式分类:

  静态流水线:同一时间内,多功能结构只能按一种功能的连接方式工作。

动态流水线:同一时间内,可以有多种功能的连接方式同时工作。

4、按处理的数据类型分类:

  标量流水线:一般数据

  向量流水线:矢量数据。X+Y=Z每一个代表一维数据。

5、流水线结构上分类:

  线性流水线:指各功能模块顺序串行连接,无反馈回路,如前面介绍的。

  非线性流水线:带有反馈回路的流水线。

 

 

 

2. 但在实际中,会出现2种情况使流水线停顿下来或不能启动:

流水线技术

2.1. 1、多个任务在同一时间周期内争用同一个流水段

。例如,假如在指令流水线中,如果数据和指令是放在同一个储存器中,并且访问接口也只有一个,那么,两条指令就会争用储存器;在一些算数流水线中,有些运算会同时访问一个运算部件。

2.2. 数据依赖。

2、

比如,A运算必须得到B运算的结果,但是,B运算还没有开始,A运算动作就必须等待,直到B运算完成,两次运算不能同时执行。
解决方案:
第一种情况,增加运算部件的数量来使他们不必争用同一个部件;
第二种情况,用指令调度的方法重新安排指令或运算的顺序。

3. 处理器流水线中的冲突


处理器的流水线设计中另外一个问题便是流水线中的冲突(Hazards),主要分为资源冲突和数据冲突。
 

3.1. 7.1 流水线中的资源冲突


 
资源冲突是指流水线中硬件资源的冲突,最常见的是运算单元的冲突,譬如除法器需要多个时钟周期才能完成运算,因此在前一条除法指令运算完成之前,新的除法指令如果也需要除法器则会存在着资源冲突。在处理器的流水线中硬件资源冲突种类还有较多,在此不做一一赘述。解决资源冲突的方法可以通过复制硬件资源或者流水线停顿等待硬件资源的方法解决。
 

3.2. 7.2 流水线中的数据冲突


 
数据冲突是指不同的指令之间的操作数存在数据相关性造成的冲突。常见的数据相关性包括:
 
WAR(Write-After-Read)相关性,又称先读后写相关性:表示“后序执行的指令需要写回的结果寄存器索引”与“前序执行的指令需要读取的源操作数寄存器索引”相同造成的数据相关性。因此,从理论上来讲,在流水线中“后序指令”一定不能比和它有WAR相关性的“前序指令”先执行,否则“后序指令”先写回了结果至通用寄存器组中,“前序指令”再读取操作数时,就会读到错误的数值。
 
WAW(Write-After-Write)相关性,又称先写后写相关性:表示“后序执行的指令需要写回的结果寄存器索引”与“前序执行的指令需要写回的结果寄存器索引”相同造成的数据相关性。因此,从理论上来讲,在流水线中“后序指令”一定不能比和它有WAW相关性的“前序指令”先执行,否则“后序指令”先写回了结果至通用寄存器组中,“前序指令”再写回结果至通用寄存器组中就会将其覆盖。
 
RAW(Read-After-Write)相关性,又称先写后读相关性:表示“后序执行的指令需要读取的源操作数寄存器索引”与“前序执行的指令需要写回的结果寄存器索引”相同造成的数据相关性。因此,从理论上来讲,在流水线中“后序指令”一定不能比和它有RAW相关性的“前序指令”先执行,否则“后序指令”便会从通用寄存器组中读回错误的源操作数

 

4. 为了能够尽可能的减少流水线停顿带来的性能损失,可以使用“动态调度”的方法

 

之所以RAW称之为真数据相关,是因为其没有办法通过寄存器重命名的方法将相关性去除。一旦产生RAW相关性,后序的指令一定要使用和它有RAW数据相关性的前序指令执行完成的结果,从而造成流水线的等待停顿。为了能够尽可能的减少流水线停顿带来的性能损失,可以使用“动态调度”的方法。动态调度的思想本质上可以归结于以下方面:
 
一方面采用数据旁路传播(Data Bypass and Forward)技术尽可能的让前序指令的计算结果更快的旁路传播给后序相关指令的操作数;
 
另一方面尽可能的让后序相关指令在等待的过程中不阻塞流水线而让其他无关的指令能够继续顺利执行。
 
早期的Tomasulo算法中通过保留站可以达到这两方面的功效,但是保留站由于保存了操作数无法做到很大的深度(否则面积和时序的开销巨大)。
 
最新的高性能处理器普遍采用在每个运算单元前配置乱序发射队列(Issue Queue)的方式,发射队列仅追踪RAW相关性而并不存放操作数,因此可以做的很深(譬如16个表项)。在发射队列中的指令一旦相关性解除之后,再从发射队列中发射出来读取物理寄存器组(Physical Register File),然后发送给运算单元开始计算。
 
有关处理器的数据相关性问题和包括动态调度技术在内的解决方法,如果阐述清楚几乎可以单独成书,本文限于篇幅只能提纲挈领式的予以简述。

我要点评