基于数据流图的异构VLIW DSP分簇方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于数据流图的异构VLIW DSP分簇方法
邱鹏飞;洪一;耿锐;徐云
【摘要】The Instruction Level Parallelism (ILP) of VLIW DSP processor is acquired through operation partitioning and software pipeline.In the previous research of operation partitioning, people always focus on reducing move operations between clusters, but rarely consider the effect of heterogeneous architecture and some registers that should be placed on reserved cluster.A method based on DataFlow Graph (DFG) for heterogeneous architecture was described to solve this problem.First,the DFG was partitioned into several sub-graphs according to the relations between operations, then the sub-graphs were refined with a heuristic method to meet the requirements of special registers.The experimental results show that this method can make the load of cluster more balanced, and achieve an average of 8% improvement over traditional method.%超长指令字数字信号处理器(VLIW DSP)的指令级并行性(ILP)主要通过指令分簇和软件流水来实现.在以前的研究中,指令分簇主要只考虑指令级并行性和减少簇间转移指令,对异构体系结构和某些寄存器只能分在指定簇上的情况考虑较少.提出一种基于数据流图(DFG)的异构体系结构上的分簇方法.利用指令的相关性将DFG划分为与簇数目相同个数的子图,再根据特殊寄存器对簇的要求采用启发式算法对子图进行调整,实验结果表明这种分簇方法使得负载更均衡,加速比相对于传统方法可以提高8%左右.
【期刊名称】《计算机应用》
【年(卷),期】2011(031)004
【总页数】4页(P935-937,977)
【关键词】超长指令字;指令级并行性;异构;分簇;启发式算法
【作者】邱鹏飞;洪一;耿锐;徐云
【作者单位】安徽省高性能计算重点实验室,合肥,230027;中国科学技术大学,计算机科学与技术学院,合肥,230027;中国电子科技集团第38研究所,合肥,230088;中国电子科技集团第38研究所,合肥,230088;安徽省高性能计算重点实验室,合
肥,230027;中国科学技术大学,计算机科学与技术学院,合肥,230027
【正文语种】中文
【中图分类】TP311.1
0 引言
超标量和超长指令字(Very Long Instruction Word,VLIW)处理器通过挖掘指令级并行性(Instruction Level Parallelism,ILP),即将多条指令在同一个时钟周期发射,来获得高性能处理能力。
随着同一个时钟周期发射的指令增多,需要的资源也越来越多。
传统的数字信号处理器(Digital Signal Processing,DSP)体系结构采用集中式寄存器文件,但当每个周期发射的指令变得很多时,很快就达到处理器设计的瓶颈。
为了解决这个问题,越来越多的DSP处理器采用分簇体系结构。
分簇体系结构需要编译器提供支持,即怎样将指令分配到各个簇上去执行[1]。
随着分簇体系结构的发展,为了使数据访问和计算可以同时进行,又出现了将地址寄存器堆放在单独的地址产生器[2](Address Generation Unit,AGU)上的异构
分簇体系结构。
它在提高数据访问并行性的同时,也给指令分簇带来了挑战。
最早提出分簇VLIW的编译分簇调度技术的是耶鲁大学的 ELLIS,他们提出的算法称为 BUG(Bottom Up Greedy)[3]。
BUG算法依据指令之间寄存器的依赖关系建立依赖图,再根据指令之间的延迟信息和关键路径信息,把处在同一关键路径上的指令优先放在同一簇内,从而减少了簇间传输指令。
文献[3]提出了一种基于数据流图(DataFlow Graph,DFG)划分的方法 RHOP(Region based Hierarchical Operation Partitioning)算法[4]来进行分簇,根据簇的数目将DFG划分为多个子图,再调整子图的构成,使得各簇的负载比较平衡。
但是上述算法都没有考虑到某一些寄存器必须分配在特定簇上的情况,以及拥有独立的地址寄存器堆的情况。
本文基于文献[3]中的分簇算法,针对目标机器模型,提出了一种基于异构VLIW体系结构的分簇算法,经过实验,该方法在目标机器模型上的执行时间较BUG算法性能平均提升了约8%。
1 目标机器及编译器框架介绍
本文的机器模型是异构的多簇体系结构,包括4个执行簇和3个地址簇。
每个执行簇的功能和结构都相同,包含多个计算功能部件和一个数据寄存器堆。
每个地址簇的功能和结构也相同,各包含一个地址寄存器堆。
各个簇之间通过总线相连,如图1所示(图中限于篇幅,只画出了2个执行簇和1个地址簇)。
在此体系结构的基础上,以可重定向编译基础设施IMPACT[5]为基础,自主开发了一款高性能C语言编译器,并命名为BWDSP100编译器。
BWDSP100编译器后端组成如图2所示。
BWDSP100编译器后端的输入是前端生成的Lcode中间代码,经过三个阶段的处理,最后生成面向目标机器的汇编代码,图中灰色底纹的三个模块是为了提高目标代码而采取的优化手段,其他模块为生成目标代码的必要模块。
图1 一个异构多簇机器模型
图2 BWDSP100编译器后端结构
2 分簇算法
目前大多数分簇算法都是针对控制块的,本文提出了一种针对函数的分簇算法:先
将函数转化为虚拟控制块,然后对虚拟控制块构建数据流图(DFG)进行分簇。
分簇主要包括计算分数、合并相关节点、调整分簇三个阶段。
经过这三个阶段之后,DFG被划分为与簇个数相等的子图,将每个子图中指令对应的寄存器添加上对应
的分簇信息即可。
2.1 将函数转化成虚拟控制块
如前所述,目前大多数分簇算法都是针对基本块[6]的,这种方法存在以下问题:1)由于基本块中指令较少,对每个基本块分别分簇,会造成基本块中的指令基
本全部被分在同一个簇上,从而导致负载不均衡;2)当前只有局部的数据依赖图,
对于一条指令来说,可能有多条位于其他基本块中的指令对它有流依赖;3)无法获
得全部的关键路径信息,导致关键路径上的指令可能被分到了不同簇上。
于是本文提出了一种全局的分簇方法(算法流程如图3所示),首先将函数转化成虚拟控制块,再对这个虚拟控制块进行分簇,这样可以考虑到整个函数内的依赖关系,提高了分簇质量。
图3 算法流程
将函数转化成虚拟控制块的算法主要是将函数中的指令复制到一个虚拟控制块中,并忽略控制流信息。
对于那些不需要寄存器的指令,如br、call等不需要复制;而
一些比较跳转指令,如cmp等,则将其转化成一条虚拟指令,忽略控制流信息。
在分簇结束后还需要按照同样的规则将函数还原。
2.2 对虚拟控制块分簇
本文的分簇算法是基于DFG的,所以首先要构建DFG。
DFG中的每一个节点对
应一条指令,节点还包含一个分数,它表示这条指令的资源使用情况,分数越高表
示其资源需求量越大。
节点之间的边表示指令之间的依赖关系[7],边也有一个分数,它表示如果这两条指令没有位于同一个分簇而要添加簇间转移指令带来的开销。
节点和边的分数用来指导对DFG的划分过程,节点的分数用来平衡各簇的负载,边的分数用来减少簇间转移指令的添加。
然后进行合并相关节点和调整分簇两个步骤,首先将相关度较高的指令连接到一起并分配到簇上。
调整分簇过程是它的逆操作,它通过计算一些分数来考虑是否需要调整指令的分簇信息来优化负载情况和减少簇间转移指令。
由于目标平台是一个异构的多簇体系结构,地址寄存器和通用寄存器分别位于不同的簇上,因此需要对DFG进行两次分簇,分别针对通用寄存器和地址寄存器。
在目标平台的应用程序二进制接口(Application Binary Interface,ABI)中约定了一些编译器保留的寄存器,例如用于参数传递、堆栈指针等的寄存器,它们只能使用指定簇上的寄存器[8],称之为宏寄存器。
但是如果在分簇之前强制将它们放在约定的簇上,会导致与它们有依赖关系的指令集中到这些簇上,使得分簇的性能降低。
因此在分簇时采用启发式的方法将它们放置在约定好的簇上,但也允许它们被分配在其他簇上,在分簇结束后再对它们的分簇信息进行调整。
2.2.1 计算分数
1)节点的分数。
节点的分数被用来估算某一个簇上的指令需要多少个周期来执行,它反映了该簇上的指令需要的资源数量。
本文利用节点的分数来指导分簇过程,使得簇间负载更均衡。
指令需要的资源是指寄存器、计算功能单元、总线等。
节点的分数通过该簇上一周期内可以支持执行该指令的条数来确定,如式(1)所示:
如前所述,由于我们的目标平台是异构多簇体系结构,地址寄存器和通用寄存器位
于不同的簇上,所以需要分别对通用寄存器和地址寄存器进行分簇。
以通用寄存器为例,当为通用寄存器分簇时,如果某条指令中不需要使用任何通用寄存器(操作数都为地址寄存器或立即数的情况),可以认为该簇在一个周期内可以支持无穷多条该指令的执行而不会对负载造成影响,因此此时node_weight=0。
为地址寄存器分簇时情况类似,即若指令中不需要任何地址寄存器则认为node_weight=0。
2)边的分数。
边的分数主要反映这条边是否在关键路径上,如果一条边位于关键路径上,那么如果将它的两个端点放在不同的簇上并插入簇间转移指令会影响调度长度。
为了计算每条边的分数,首先计算它的松弛度,松弛度为0表示该边位于关键路径上,它的定义如下:
其中:lstart表示指令的最晚执行时间,estart表示指令的最早执行时间,delay edge是src指令的延迟。
根据上述定义,先计算出所有的edge_slack,edge_slack为0的边分数设置为一个较大的值,表示这些边位于关键路径上。
与关键路径最近的那些边的分数设为一个较小的值,它们不在关键路径上。
完成这一步后,提高与关键路径最近的那些边的延迟,使得它们的slack也为0,这将使得这些边不在关键路径上的端点的lstart减少。
然后再重新计算剩余边的edge_slack,进行相同的操作,唯一的不同是这时被认为是关键路径的边其实只是次关键路径,因此其分数设置为略小于关键路径的分数。
这个过程相当于将关键路径和与它相邻的边移出了DFG,剩余的部分继续执行第一步的操作。
根据实验结果,HIGH_WEIGHT,MID_WEIGHT,LOW_WEIGHTT 这三个值分别取10、8、1时得到的分簇结果最好。
2.2.2 合并相关节点
这一过程利用前面计算出来的edge_weight将关系紧密的指令归类到一起,并给它们指定分簇信息,形成一个初始的分簇结果。
如前所述,edge_weight较大的
边表示其位于关键路径上,如果将其两端的指令指定到不同的簇上并添加簇间转移指令会影响调度长度,因此它们需要被指定在同一簇上。
合并相关节点分为很多轮进行,它的主要步骤如下:1)根据edge_weight将所有的边排序,edge_weight较大的边将先考虑。
另外为了使尽可能多的节点被合并,
合并过程将沿着DFG的叶子到根的方向进行。
按照这个顺序对每条边依次进行。
2)若两个端点在这一轮没有被合并,那么将它们合并为一个节点。
3)若当前节点数小于等于目标机器中簇的个数则停止,否则重复1)、2)。
在完成合并节点后,所有的指令被划分为n个组(n小于目标机器簇的个数),然后可以给每一个组指令一个簇,作为这一组指令的初始分簇信息。
2.2.3 调整分簇
在得到初始分簇结果后,还需要对其进行调整,直到达到比较好的分簇结果。
对分簇结果的评价采用三个参数来确定。
1)Cluster_load。
该参数表示每个簇上的负载程度。
要计算Cluster_load首先要
计算每个时钟周期的负载情况Cloadt:
node@t表示区间[estart,lstart]包含t的所有指令,slack是该指令的自由度。
由此可定义整个簇的负载状况:
3)Gain。
每次将一个 node移动到另一个簇上时,overall_load都会发生改变,
同时会有一些边需要被切断或者重新连接上。
算法的目的在于使得overall_load
变小,被切断的边尽可能少。
如前文所述,宏寄存器必须被分配在指定的簇上,如果在分簇的过程中被分在错误
的簇上,分簇结束后通常需要两条簇间转移指令才能纠正过来。
因此在调整分簇过程中尽量避免将包含这种寄存器的指令移动到错误的簇上,并鼓励将其移动到正确的簇上。
调整算法按照合并算法的相反顺序进行,从初始分簇结果开始,每一步考虑将每个节点(这个节点可能是合并得到的虚拟节点)移动到其他簇会不会得到正的Gain,
如果可以就修改它的分簇信息。
如果没有任何一个节点分簇信息的改变可以得到正的Gain,就将DFG还原到合并前的状态,继续考虑调整节点的分簇信息,直到到达原始DFG且任何节点分簇信息的调整都无法带来性能的提升,这时就得到了最终的分簇结果。
3 实验
本文在BWDSP100上实现了上述算法和RHOP算法、BUG算法,并选用DSP
典型应用DSPstone测试集进行测试。
图4所示的是DSPstone[9]中的Benchmark分别使用这三种算法分簇相对于不分簇时的加速比。
图4 实验结果(e-RHOP为文中提出的算法)
从图4可以看出,对于代码规模较大、使用寄存器较多的Benchmark,例如矩阵乘法、FFT等,本文提出的算法和RHOP算法相对BUG算法优势比较明显,这是因为采用DFG划分的方法使得各簇间负载比较均衡,寄存器压力大较时[10]表现比较明显。
而像lms、n_complex_updates这一类程序,它们的代码规模较小,使用的寄存器少且相互之间依赖关系比较复杂,各种分簇方法大多将所有的指令都分在同一个簇上,因而性能差别很小。
由于本文提出的算法针对地址寄存器分簇和宏寄存器分簇做了优化,因此相对于RHOP算法也有较大提升。
4 结语
本文针对异构VLIW DSP分簇体系结构,提出了一种基于异构VLIW分簇体系结
构的分簇算法,考虑了需要分在特定簇上的寄存器的情况,并在BWDSP100编译器上对算法进行了测试和评估。
实验结果表明,该算法在异构分簇体系结构上相对BUG算法取得了很好的性能。
参考文献:
[1]CAPITANIOA,DUTTN,NICOLAUA.Partitioned register files for VLIWs:A preliminary analysis of tradeoffs[C]//Proceedings of the 25th Annual International Symposium on Microarchitecture.New York:ACM,1992:103-114.
[2]KITAGAKI K,OTO T.New address-generation-unit architecture for video signal processing [C]//Visual Communications and Image Processing.Boston:SPIE,1991:891-900.
[3]DESOLI G.Instruction assignment for clustered VLIW DSP compilers:A new approach, HPL-98-13 [R].Palo Alto:Hewlett-Packard Company,1998.
[4]CHU M.Region based hierarchical operation partitioning for multicluster processors[C]//PLDI'03:Proceedings of the ACM SIGPLAN 2003 Conference on Programming Language Design and Implementation.New York:ACM,2003:300-311.
[5]HWU WW.The IMPACT research group[EB/OL].[2010-07-10].http://impact.crhc.illinois.edu/.
[6]OZER E,BANERJIA S,CONTE T.United assign and schedule:A new approach to scheduling for clustered register file microarchitectures[C]//Proceedings of the 31th Annual International Symposium on Microarchitecture.Dallas:Microarchitecture, 1998:308 -315.
[7]LAPINSKII V,JACOME M,de VECIANA G.High-quality operation binding for clustered VLIW datapaths[C]//Proceedings of the 2001 Design Automation Conference.New York:ACM,2001:702-707.[8]FIELDSB,BODIK R,HILL M D.Slack:Maximizing performance under technological constraints[C]//Proceedings of the29th Annual International Symposium on Computer Architecture.Anchorage:ISCA,2002:47-58.
[9]DSPstone[EB/OL].(2006-05-23)[2010-04-
12].http://www.ert.rwth-
aachen.de/Projekte/Tools/DSPSTONE/dspstone htm.
[10] RAU B.Iterative modulo scheduling:An algorithm for software pipelining loops[C]//MICRO 27:Proceedings of the 27th Annual International Symposium on Microarchitecture.New York:ACM,1994:63-74.。