计算机体系结构量化研究方法学习(三)

指令级并行

大约在1985年之后的所有处理器都使用流水线来重叠指令的执行过程。指令之间可能实的并行执行称为指令级并行(ILP)。
ILP大体有两种不同开发方法:

  1. 依靠硬件来帮助动态发现和开发并行
  2. 依靠软件技术在编译时静态发现并行
    一个流水化处理器的CPI值等于基本CPI与因为各种停顿而耗费的全部周期之和:
    流水线CPI=理想流水CPI+结构化停顿+数据冒险停顿+控制停顿

指令级并行定义

开发指令间的并行。基本块(一段熟悉怒执行代码,除入口外没有其他转入分支,除出口外没有其他转出分支)中可以利用给的并行数十分有限。
提高ILP最简单最常见方法是在循环的各次迭代之间开发并行。这种并行经常被称为循环级并行。

数据相关与冒险

要确定一个程序中可以存着多少并行以及如何开发并行,判断指令之间的相互依赖是至关重要的。
共有三种不同类型的相关:数据相关、名称相关和控制相关。

数据相关

如果以下任一条件成立,则说明指令j数据相关于指令i:

  • 指令i生成的结构可能被指令j用到;
  • 指令j数据相关于指令k,指令k数据相关于指令i
    举个例子

如果两条指令是数据相关的,那么它们必须按顺序执行, 不能同时执行或者重叠执行。这种相关意味着两条指令之间可能存在由一个或者多个数据冒险构成的链。同时执行会导致一个具有流水线互锁的处理器检测冒险和停顿,从而降低或消除重叠。
数据相关传递了三点信息:(1)冒险的可能性;(2)计算结果必须遵循的顺序;(3)并行开发的上限
可以采取两种不同方法克服相关性(1)保护相关性但避免冒险(2)转换代码消除相关性

名称相关

当两条指令使用相同的寄存器或存储器位置,但没有数据流动的情况,称为名称相关。改变指令中的名称可以使指令不再冲突。

数据冒险

主要指令间存在名称相关或者数据相关,而且他们非常接近,足以使执行期间的重叠改变对相关操作数的访问顺序。
可能出现的数据冒险为:

  • RAW(写后读):j试图在i写入一个源位置之前读取它,所以j会错误地获得旧值。
  • WAW(写后写):j试图在i读取一个目标位置之前写入该位置,所以i会错误地获取新值。
  • WAR(读后写):j尝试在i读取一个目标位置之前写入该位置,所以i会错误地获取新值。

控制相关

最后一种相关事是控制相关。控制相关决定了指令i相对于分支指令的顺序,使指令i按正确程序顺序执行。
一般来说,控制相关会施加下述两条约束条件。

  1. 如果一条指令预一个分支控制相关,那就不能把这个指令移到这个分支之前,使它的执行不再受控于这个分支。
  2. 如果一条指令预一个分支没有控制相关,那就不能把这个指令移动到这个分支之后,使其执行受控于这个分支。

保护异步行为意味着对指令执行顺序的任何改变都不能改变程序中激发异常的方式。通过维护数据的相关和控制相关来保护的第二个特性是数据流。数据流是指数据值在生成结果成和使用结果的指令之间进行的数据流动。

揭示ILP的基本编译器技术

一些简单的编译器技术,可以用来提高处理器开发ILP的能力。

基本流水线调度和循环展开

为使流水线保持满载,必须找出可以在流水线中重叠的不相关指令序列,充分开发指令并行。为了避免流水线停顿,必须将相关指令与源指令的执行隔开一定的时间周期。
以一个例子说明,

for (i=999;i>0;i=i-1)
	x[i]=x[i]+s;

这个循环每个跌代替都是相互独立的,从而可以看出这个循环是并行的。看这个循环的性能,说明如何利用并行来提高一个MIPS流水线性能。

第一步将上述代码转换成MIPS汇编语言。在下面代码段中,R1最初是数组元素的最高地址,F2包含标量S。寄存器R2的值预先计算得出,是R2成为最后一个额进行运算的额最高地址。

Loop:  L.D     F0,0(R1)    ;F0=数组元素
		ADD.D   F4,F0,F2	;加上F2的标量
		S.D     F4,0(R1)	;存储结果	
		DADDUI  R1,R1,#-8	;指针逐减8个字节
		BNE		R1,R2,LOOP	;判断跳转

根据简单流水线上的调度这个循环时的执行情况(算上延时)。如下两端所示,一共需要9个周期

							周期
Loop:  L.D     F0,0(R1)    ;1
							;2
		ADD.D   F4,F0,F2	;3
							;4
							;5
		S.D     F4,0(R1)	;6
		DADDUI  R1,R1,#-8	;7
							;8
		BNE		R1,R2,LOOP	;9

重新调度这个循环的话,可以使其只有两次停顿。这样只需要7个周期完成一次循环迭代。

							周期
Loop:  L.D     F0,0(R1)    ;1
		DADDUI  R1,R1,#-8	;2
		ADD.D   F4,F0,F2	;3
							;4
							;5
		S.D     F4,0(R1)	;6
		BNE		R1,R2,LOOP	;7

但对数组元素进行实际运算仅占7个时钟周期的三个。其余四个包括循环开心和2次停顿。
循环展开还可用于提高调度效率。

循环展开与调度

在实际中,这一过程必须采用系统方式有编译器或硬件来完成。

  • 确认循环迭代不相关,判定展开循环是有用的
  • 使用不同的寄存器,避免由于不用运算使用相同的寄存器而施加的非必要约束
  • 去除多余的测试与分支
  • 观察不同迭代中的载入与存储指令互不相关,判定展开后的循环中的载入和存储指令可以交换位置
  • 对代码进行调度

用高级分支预测降低分支成本

分支会伤害流水线的性能。循环展开是降低分支冒险的一种方法,我们还可以通过预测分支的行为方式来降低分支的性能损失。

相关分支预测

2位预测器方案仅用单个分支的最近行为预测分支的未来行为。如果同时还能查看其他分支的最近行为,那就有可能提高预测准确率。

if (aa==2)
	aa=0;
if (bb==2)
	bb=0;
if(aa!=bb){}

下面是通常为这一代码生成的MIPS代码,假定aa和bb分别被赋值带R1和R2:
将分支标记为b1、b2和b3,我们可以看出来一点,分支b3的行为与分支b1和b2的行为有关。显然,如果b1和b2都为执行,那么b3会执行转移。如果预测器仅用一个分支的行为来预测分支结果,那显然不会捕获这一行为。

利用其它分支行为来进行预测的分支预测器成为相关预测或两级预测器。 现有相关预测器增加最近分支的行为信息,来决定如何预测一个给定分支。硬件上可以使用m位移位寄存器来记录m个分支的全局历史。

竞赛预测器

多个预测器结合,全局信息的预测器和局部信息的预测器,用选择器结合起来可以对中等规模的预测为实现很好的预测准确度。

i7分支预测器

两级预测器,第一级预测器较小,设计用来满足周期约束条件:每个时钟周期预测一个分支,还有一个较大的耳机预测器作为备份。包含三个不同预测器(1)两位预测器(2)全局历史预测器(3)循环退出预测器

用动态调度克服数据冒险

在动态调度中,硬件会重新安排指令的执行顺序以减少停顿,并同时保持数据列和异常行为。它的有点

  1. 它允许针对一种流水线编译的代码在不同流水线上高效执行,不需要在使用不同为体系结构时重新进行编译
  2. 在编译代码时可能不知道相关性,利用动态调度可以处理器
  3. 允许处理器容忍一些预料之外的延时,比如缓存缺失

动态调度:思想

简单流水线指令按照程序顺序发射。在经典的五级流水中,会在指令译码(ID)期间检查结构冒险和数据冒险。

乱序执行可能导致WAR和WAW冒险,还会是异常处理变得很复杂。
动态调度处理器可能生成一些非精确异常。
(1)流水线在执行导致异常的指令时,可能已经完成了按照程序顺序排在这一指令之后的指令。
(2)流水线在执行导致异常的指令时,可能还没有完成按照程序顺序排在这一指令之前的指令。
为了能够执行乱序执行,将ID流水线大体分为两个阶段
1、发射——译码指令,检查结构性冒险
2、读操作数——一直等到没有数据冒险,然后读取操作数

在动态调度流水线中,所有指令都循环经历发射阶段,但是在第二阶段停顿或者相互旁路,从而进入乱序执行状态。

Tomasulo算法进行动态调度

IBM浮点单元使用一种支持乱序执行的高级方法,会跟随指令的操作数何时可用,将RAW冒险降至最低,并在硬件中引入寄存器重命名功能,将WAW和WAR冒险降至最低。
尽管每条指令可以需要任意数目的时钟周期,但一共需要三步
(1)发射——从指令队列的头部获取下一条指令,指令队列按照FIFO顺序维护,以确保数据量的正确性。
(2)执行——如果还有一个或多个操作数不可用,则在等待技术的同时监视公共数据总线。当一个操作数变位可用时,就将它放到任何一个正在等待它的保留站中
(3)写结果——在计算出结果之后,将其写到CDB上,再从CDB传送给寄存器和任意等待这一结果的保留站。
使用Tomasulo算法的MIPS浮点单元的基本结构

动态调度:示例和算法(这部分以后再看)

在详细研究Tomasulo算法之前,可以看一些列子。

Tomasulo算法

基于硬件的推测

基于硬件的推测结合了三种关键思想(1)利用动态分支预测选择要执行那些指令(2)利用推测,可以解决控制相关问题之前执行指令(3)进行动态调度
基于硬件的推测根据硬件崔策的数据值流来选择合适执行指令,这种执行程序的方法实际上是一种数据流执行:操作数一旦可用就立即执行运算。
实现推测之后的关键思想在于允许指令乱序执行,但强制他们循环提交,以防止在指令提交之前采取任何不可换回的动作。当我们添加推测时,需要将完成执行的过程与指令提交区分开来。在指令执行序列中添加这一提交阶段需要增加一组硬件缓冲区(重排序缓冲区)。重排序缓冲区(ROB)通过保留站扩展寄存器集一样,提供了附加寄存器。ROB会在一定时间内保存指令的结果,这段时间从完成该指令的相关运算算起,到该指令提交完毕为止。
ROB中的每个项目都包含四个字段:指令类型、目的地字段、值字段和就绪字段。指令类字段指定这个指令是分支、存储指令还是寄存器操作。目的地字段提高了应当向其中写入指令结果的寄存器编号或存储器地址。值字段用于在提交指令之前保存指令结果值。
这张图给出包含ROB的处理器的硬件结构。存储指令仍然分两步执行,但第二步是由指令提交来执行。尽管保留站的重命名功能由ROB代替,但在发射运算之后仍然需要一个空间缓冲他们,直到他们开始执行为止。

在指令执行时设计一下四个步骤:

  1. 发射——从指令队列获得一条指令,。如果存在空保留站而且ROB中有空插槽,则发射该指令;如果寄存器或ROB中已经包含有这些操作数,则将其发送到保留站。
  2. 执行——如果还有一个或多个操作数不可用个,则在等待计算存储器的同时检测CDB,这一步骤检测RAW冒险。当保留站中有这两个操作数时,执行该运算。指令在这一阶段坑你占用多个时钟周期。
  3. 写结构——当结果可用时,将它卸载CDB上,并从CDB写到ROB并写到任何等待这一结果的保留站。将保留站标记为可用。
  4. 提交——这是完成指令的最后一个阶段,在辞职后将仅留下它的结果。根据要提交的指令是预测错误的分支、存储指令或者任意其他指令。

以多发射和静态调度来开发ILP

多发射处理器

多发射处理器讲义将CPI降低到小于1,就是允许在一个时钟周期发射多条指令,主要以下3类:
(1) 静态调度超标量处理器
(2) VLIW 超长指令字处理器
(3) 动态调度超标量

超标量处理器每个时钟发射不同数目的指令,如果他们采用静态调度则采用循环执行,如果采用动态调度则采用乱序执行。

VLIW处理器每个时钟周期发射固定数目的指令,这些指令可以设置为两种格式之一:一种格式是长指令。另一种是一个固定的指令包。

动态调度,多发射和推测来开发ILP

用于指令传送和推测的高级技术

提高指令提取带宽

多发射处理器需要每个时钟周期提取的平均指令数目至少等于平均吞吐量。当然提取这些指令需要有足够宽的路径能够有足够宽的路径能够连向指令缓存。

分支目标缓冲区

为了减少分支流水线的分支代价,必须知道尚未译码的指令是不是分支,如果是分支,则需要知道下一个程序计数器应当是什么。

由于分支目标缓冲区预测下一条指令地址,并在对该指令译码之前把它发出去。如果所提供指令的PC与预测缓冲区中的一个地址匹配,则将相应的预测PC作用下一个PC。

返回地址预测器

如果从多个地方调用跟这个进程,而且来自一个地方的多个调用在时间方面比较分散,那种这种预测的方法准确率会很低

集成指令提取单元

作为独立的自主单元,为流水线的其余部分提供指令。
包括以下的功能:
(1)集成分支预测
(2)指令预取
(3)指令存储器访问与缓存

ILP局限性的研究

窗口大小掉整数程序的影响不像对浮点数程序那么严重。这一结果指向了这两种程序的关键区别。浮点程序能够利用循环级并行,整数程序的其他因素(分支预测,寄存器重命名等)都是重要的限制因素。

ILP方法与存储器系统

  • 为了能够大范围进行推测,必须消除存储器引用的歧义。在基于硬件的方案中,存储器地址的动态运行时消除歧义是使用前面的Tomasulo算法。
  • 当控制类不可预测时,当基于硬件的分支预测优于在编译时完成的软件分支预测时,基于硬件的较佳
  • 基于编译器的方法能够了解代码序列。

多线程

多线程技术支持多个线程以重叠方式共享单个处理器的功能单元。
而与之相对的,开发线程级并行的更一般方法是使用多处理器。但是多线程不会复制整个处理器。要复制一个处理器核心每个线程的状态,就要为每个线程创建独立的寄存器堆、PC和页表。存储器本身可以通过虚拟存储器机制共享,这几只已经是支持多重编程了。
实现多线程的硬件方法有三种。细粒度多线程每个时钟周期在线程之间进行一次切换,是多个线程的指令执行过程交织在一起。这种交织是以轮询的方式执行的。不足时会减缓个体线程的执行速度。粗粒度多线程的设计就是代替细粒度多线程,它仅在成本较高的时候进行切换。它的不足是客服吞吐量损失能量非常有限。最常见的是同时多线程。这是细粒度多线程的一种变体,他是在多发射、动态调度处理器的顶层实现细粒度多线程是自然出现的。利用线程级并行来隐藏长延时时间,提高单元利用率。SMT关键在于认识到通过寄存器重命名和动态调度可以执行来自独立线程的多个指令。而不考虑指令的相关性。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值