收藏 分享(赏)

复杂非紧密嵌套循环变换在并行编译中的应用.doc

上传人:cjc2202537 文档编号:196808 上传时间:2018-03-23 格式:DOC 页数:18 大小:108.50KB
下载 相关 举报
复杂非紧密嵌套循环变换在并行编译中的应用.doc_第1页
第1页 / 共18页
复杂非紧密嵌套循环变换在并行编译中的应用.doc_第2页
第2页 / 共18页
复杂非紧密嵌套循环变换在并行编译中的应用.doc_第3页
第3页 / 共18页
复杂非紧密嵌套循环变换在并行编译中的应用.doc_第4页
第4页 / 共18页
复杂非紧密嵌套循环变换在并行编译中的应用.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、复杂非紧密嵌套循环变换在并行编译中的应用复杂非紧密嵌套循环变换在并行编译中的应用黄骏伟(复旦大学并行研究所,上海 200433)摘要在并行编译中.循环变换是开发程序并行度的主要方法,但存在复杂控制流的非紧密嵌套循环往往无法得到有效的并行化.文章结合分析 Benchmark 和实现自动并行化系统 AFr 中复杂非紧密嵌套循环变换的经验,给出复杂非紧密嵌套循环变换的特点及其在并行编译中的应用.关键词并行编译非紧密嵌套循环循环变换文章编号 10028331 一(2005)32006805 文献标识码 A 中图分类号 TP311TheAppliacthonofComplicatedNon-perfec

2、tNestedLoopinParallelCompilerHuangJunwei(FudanUniversity,Shanghai200433)Abstract:Looptransformationisthebasicwaytomaximizationparallelism,butitdoesntworkinthecaseofnonperfectnestedloopwithcomplicatedcontrolflow.Thispapercomesoutthefeaturesofnonperfectnestedloopanditsusefultransformationinparallelcom

3、pileronthebasisoftheexperienceofimplementofAFrwhichisaautomaticparallelizesystemandanalysisofsomebenchmark,Keywords:parallelcompiler,non-perfectnestedloop,looptransformation1 引言近年来,随着超级计算机的发展,无论是共享存储系统还是分布式存储的机群系统.软件应用在系统中占了越来越重要的地位.但由于现存的科学计算程序大多都是串行计算程序,因此.自动地将串行程序转换成并行程序的并行编译系统就显得十分重要.针对不同的并行系统模型

4、的特点,有不同的并行化方法,其中对共享存储系统(SMP)的并行化主要考虑的是计算空间的并行性和数据的局部性,该领域已被广泛研究并系统化,其中包括已经商品化的 KAP,Stanford 大学的 SUIF,Illinois 大学的 Polaris 和我所的 AFT.对于分布式存储系统(MPP)的研究则着重于数据和计算的一致划分上,虽然也进行了广泛的研究,其中 Andemon,Lam 和 Li2I3.句在抽象数据划分的核心问题上做出了巨大的贡献,但可惜的是这些模型并没有很好地实例化,或者效果并不理想,到目前为止,还没有一个能够对广泛程序取得理想加速比的系统.根据科学计算程序的特点,无论 SMP 还是

5、 MPP 模型,循环都是并行化最主要的处理单元.在并行化一些 benchmark 中的程序时.我们发现很多并行系统无法对如下:doS1goto(),t(i)S2do1P1enddoS3if(cond)do2682005.32 计算机工程与应用enddos4enddo存在复杂控制流的非紧密嵌套循环无法有效的并行化,从而影响了程序整体并行性的开发.实际上,我们发现只要经过简单的循环变换_l_,这些复杂循环就可以有效地并行化 ,其中包括共享存储空间下的计算并行化,也包括分布式存储空间下的计算和数据划分问题.本文结合分析 benchmark 和开发 AFT并行系统的过程中取得的经验,给出复杂非紧密嵌套

6、循环变换方法的一些探讨.2 常见简单循环变换2.1 循环交换循环交换就是交换嵌套循环中循环的顺序.无论对 SMP还是 MPP 系统来说 ,都需要粗粒度和大力度的并行性,合适的循环交换往往能提高嵌套循环的粒度的同时减少同步和通讯.是大规模并行化一个十分有用的变换.循环交换的条件(21):对紧密嵌套循环的交换是合法的,当且仅当所有方向向量置换后不改变原方向向量的类型,也就是说以“方向为最左非“=“的方向向量和以 “为最左非“=“的方向向量不会互换.考虑以下的嵌套循环模型:doi如芦丹nOeedSed0Ai+I,jl=AiJ+1】enddoenddo原方向向量为(,),交换 J 循环后变为(,).

7、类型发生变换,因此是不合法的.循环交换可以帮助循环并行的粒度(并行化后每个处理机执行任务规模的大小)和并行的力度(循环迭代的长度),通过循环交换,将大力度的循环外提以提高其粒度,就能大大提高循环并行化的效果.2.2 循环拆分循环拆分是向量系统常用的变换,在并行系统中,循环拆分可以把某些跨迭代的相关转变成跨循环的相关,但同时也减少了并行性粒度且增加而外的通讯和同步开销.因此,在并行系统中,循环拆分更多的是用于将非紧密嵌套循环转换成多个紧密嵌套循环.以更有利于循环的并行化.考虑以下例子:doi=1,Ndoj=2,MAi,jl=Ai 一 1,Jl+enddodoj=3,PAi,jl=Ai-2,jl+

8、?enddoenddoi 一循环不可并行,j 循环可并行,考虑到并行粒度,应该将i-循环和 j-循环交换,但由于不是紧密嵌套循环,因此需要将循环转换成紧密嵌套循环.实际上,拆分 i 一循环和合并 j 一循环都可以达到目的,这里采用拆分 i 一循环并交换:doj=2.肼doi=1,NAi,jl=Ai 一 1enddoenddodoi=3,Pdoi=1,NAiJ】=A【一 2jl+jenddoenddo循环拆分的条件(22):doiS1S2enddo上面的循环当不存在 S2_+S1 的相关时就可以拆分.若存在这种相关.而且只涉及到临时变量或临时数组时,可以通过数组扩张来消除这种相关从而可以进行循环

9、拆分.2.3 循环合并循环合并是循环拆分的相反动作,它可以提高循环的粒度,减少同步和通讯,但容易引入跨迭代的相关.实际上,在并行系统中.对源程序进行循环合并更多的是为了将多个里层循环合并成一个循环以形成紧密嵌套循环,从而可以进一步循环交换.循环合并的条件(23):doilenddod0S2enddo可以被正确合并成:d0S1S2enddo条件是合并前的前向相关.s1 一.s2 合并后不会变成 S2 一Sl 的反向相关.在简单循环中.利用相关性测试能够很容易地判断是否满足循环合并的要求,但在存在复杂控制流的嵌套循环中,循环合并就变得复杂多了.先考虑考虑如下的不带 if-then 控制流的循环合并

10、(2_4):Preldoj=l,MS1enddoPostldoj=1.肼S2enddoPost2可以合并成如下形式:doj=1.肼if(j=1)PrelS1Ifq=X)PostlS2if(,=)Post2enddo条件是合并后所有原 S1 一 P0st1 与 P0st1 一 S2 的相关保持原方向.其中的取值范围可以如下条件得出:若原存在形如 S1(s)一 P0st1 的相关,则 s;若原存在形如 Postl-*S2(t)的相关性,则=.其中 Sl(s)表示.s1 第 s 次迭代的执行.S2(t)类似.若 st 则的取值范围为空 .表示原循环不可合并.进一步考虑带 if-then 的循环合并(

11、25):if(cond)doi=1. vS1enddoelsedoi=1,NS2enddoendif可以通过添加一临时变量保存进入 if-then 时 cond 的值来达到循环合并的效果:doi=1,Nif(i=1)cond_tmp=condif(cond_tmp)S1计算机工程与应用 20o5-3269elseS2enddo最后考虑存在类 switch 的 goto 的循环(其中 goto 语句根据 t(i)的值决定跳往哪个 j 一循环)(2-6):doi=1,Ngoto(jlJ2,“.jk),t(i)dojl=l,MS1enddodoj2=l,MS2enddod0=1,肘enddoendd

12、o可别合并成:doi=1,Ndoj=l,Mif(,=1)cond=t(i)goto(S1,S2,Sk),cond.s1S2enddoenddo另外,可以利用循环合并来减少边界计算对共享存储系统中的数据划分的影响.如:Dol=1.NDoj=1.肘._1Ai,J3=A【一 1EnddoEnddoDo,_1.A【,=1ooEnddo上面的两个循环如果直接考虑数据划分的话.则前面的两重循环要求对数组 A 按维划分,而第二个循环则要求按 i维划分,因此发生冲突.但如果我们把两个循环如下和并在一起就可以统一按 J_维划分了:Do,_1.Doj=1.肘一 1if(,!=)Ai,jl=Ai 一 1ElseAi

13、,j=100EndifEnddoEndd03 复杂非紧密嵌套循环变换根据第 1 例所示的复杂非紧密嵌套循环的形式.我们定义702005.32 计算机工程与应用复杂非紧密嵌套循环为:一个/,层嵌套循环(由外往内依次 f,f2,f)其中至少有一层循环 lk(Jn)由以下结构组成 :i.若干个层循环;iiJ 若干不含 f+层循环的串行代码;iii.类 switch 的 goto 语句且 goto 语句不可跳转到+1 层循环内部或层循环外部;iv.if-then 结构且该结构可由前面.对于满足上面定义的复杂非紧密嵌套循环.根据不同的需求(如第 4 节中提到的 SMP 系统下由于 f1,f2,一 1 不

14、可并行而需要利用循环交换来提高并行粒度和 MPP 系统下的数据划分算法的要求),常见的一种变换就是将其转换成紧密嵌套循环.实际上由三种方法可将上述的复杂非紧密嵌套循环转换层紧密嵌套循环:一是合并所有层循环并将 ii,iii,iv 类结构也并入循环体中;二是拆分 f1,f2,层循环,将原嵌套循环转换层多个紧密嵌套循环;三是混合采用拆分和合并方法 .下面就分别给出复杂非紧密嵌套循环的合并和拆分条件及算法.合并层循环:i.遍历内的每个带有层循环的 if-then 结点,根据条件(25)判断是否可将其合并成一个层循环;若可则用新的层循环替代原 if-then 结点;-i.遍历内的所有层循环,对任两个层

15、循环只和 Pm.nm(n 和 m 表示其在层循环的先后顺序),则合并后不能存在,P.的相关;iii.遍历内的所有层循环,对任意串行语句,根据条件(2 4)5断其是否可加入合并循环中,并求出其墨值的范围且不为空,注意这里应该对 S 与所有 +层循环重复应用条件 (2-4);iv.遍历内的所有层循环,对任意两个串行语句和 S.kt.有不等式 X置;利用所有这些不等式和根据 iii 求出的范围值求取所有的取值.若有解.则通过;v.若可通过上面的条件测试,则可根据(23),(2_4),(25)和(2-6)的合并方法合并所有层循环.拆分循环:i.遍历循环内的所有节点,判断是否在上向后的相关性 :若存在,判断涉及到的变量或数组是否在上可私有化,若可则利用数组扩张消除其相关性:.i.重复,直到不存在向后的相关性;iii.拆分循环.4 实例研究4.1SMP 模型下的 Sixtrack

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报