首页 > 范文大全 > 正文

指令级并行中的循环展开和指令调度

开篇:润墨网以专业的文秘视角,为您筛选了一篇指令级并行中的循环展开和指令调度范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:从20世纪80年代以来,大多数处理机都使用流水线将指令重叠并行执行,以实现提高性能的目的。我们将这种指令间存在的潜在的并行性称为指令级并行。开发指令级并行的方法有两类:基于硬件的动态开发和基于软件的静态开发。在应用中,我们可以把硬件与软件的技术和动态与静态的方法结合起来,以便充分开发程序中潜在的指令级并行。

关键词:循环开展 指令调度

一、循环展开

在一连串的代码中,除了入口和出口外,如果没有其他分支指令和转入点,我们就称其为一个基本程序块。由于程序中常常每隔5-7条指令中就会有一个分支,指令之间还可能存在相关性,所以,在基本程序块中能开发的指令的并行性就很有限了。为了能明显的提高性能,必须跨越几个基本块来开发指令级并行。

增加指令之间并行性的最简单和最常用的方法就是开发循环的不同迭代之间的并行性。这样的并行性称为循环级并行性。例如:

for(n = 1; n < 10; n++) a[n] += t;

这里的每次循环都可以和其他循环重叠并行执行。但是在每次循环内部,却没有并行性。在本文中,我们将讨论把这种循环级并行性转换成指令级并行的方法。

二、相关

确定程序中指令间存在怎样的相关,对于确定程序有多少并行性及如何开发这些并行性有着重要的意义。如果两条指令相关,那么它们就不能并行执行或只能部分重叠执行。相关分为三种,分别是:数据相关,名相关和控制相关。而流水线的冲突也分为三种类型:结构冲突,数据冲突,控制冲突。相关是程序的一种固有属性,它反映了程序中指令间相互依赖的关系。但是,具体的一次相关是否会使实际冲突发生以及该冲突会带来多久停顿,就是流水线的属性了。

数据相关限制了开发指令级并行的程度,所以,我们需要找出克服这些限制的方法,第一,保持相关,避免发生冲突;第二,通过代码变换,消除相关。

指令调度是一种用来避免冲突的方法,但它并不改变相关。由于相关的存在,必须保持程序的顺序,即由源程序确定的在串行方式下指令的执行顺序。然而,对于正确地执行程序来说,必须保持的关键属性是数据流和异常行为。

1.实例

当不执行指令调度时,程序的执行情况如下:

指令流出时钟

Loop: L.D F0,0(R1) 1

(空转) 2

ADD.D F4, F0, F2 3

(空转) 4

(空转) 5

S.D F4, 0(R1) 6

DADDIU R1, R1, #, -8 7

(空转) 8

BNE R1,R2,LOOP 9

(空转) 10

在用编译器对上述程序进行指令调度后,程序执行情况如下:

指令流出时钟

Loop: L.D F0,0(R1) 1

DADDIU R1, R1, #, -8 2

ADD.D F4, F0, F2 3

(空转) 4

BNE R1,R2,LOOP 5

S.D F4, 8(R1) 6

这里,把DADDIU指令调度到L.D指令和ADD.D指令之间的空转拍,把S.D指令放在分支指令的延迟槽中。经过这样的指令调度后,一个元素操作时间从10个时钟周期减少到6个时钟周期,只有一个空转周期。

参考文献:

[1]李文龙,刘利.软件流水中的循环展开优化.北京航空航天大学学报,2004.

[2]连瑞琦,吴承勇.代码优化与指令调度的集成,计算机学报,2001.