一种可重构编译器中循环流水迭代间启动间距自动分析方法技术领域
本发明属于可重构计算领域,尤其涉及一种可重构编译器中循环流水迭代间启动间距自
动分析方法。
背景技术
目前,在研究多层循环到并行流水硬件结构自动映射时,主要包括:(1)以CGRA为代表
面向粗粒度可重构硬件平台的循环流水硬件结构映射,通过函数级程序特征分析实现循环到
固定流水硬件模板结构的映射,可以简化循环映射的复杂度,但是限制了循环程序对可重构
平台的通用性;(2)以Xilinx提出的VivadoHLS(HighLevelSynthesis,高层次综合工具)
为代表的细粒度可重构编译工具,通过循环程序特征分析,完成循环程序到异构加速平台的
指令级映射,与粗粒度可重构编译器相比,指令级硬件映射具备更广泛的通用性和推广意义。
目前,GarpCC编译器中采用IMS(RausIterativeModuloScheduling)调度算法实现循环流
水的控制映射,但是只对最内层循环进行流水控制;XPP中采用流水向量化方法,但是不能
处理循环体间RAW数据依赖关系引起的非最内层循环迭代间流水启动间距问题;Vivado
HLS、ROCCC、ImpulseC等HLS工具在实现多层循环到流水并行FPGA硬件结构映射时,
均采用语句制导方式进行迭代间流水启动间距控制,即在源程序C代码循环中手动插入类似
#pragmaII=xx的制导语句,控制循环映射成流水并行硬件结构之后迭代间启动间距的生成。
该方式只能针对每层循环生成固定值的迭代间启动间距,同时在使用可重构编译器进行可重
构计算应用部署时需要反复迭代综合仿真过程才能确定最终合适的迭代间流水启动间距值,
并且没有提出自动化分析和相关优化方法,极大地制约了可重构计算应用的部署效率,同时
会影响细粒度可重构编译器在工业界的推广。
正是基于以上问题,本发明提出了一种可重构编译器中循环流水迭代间启动间距自动分
析方法,并在基于ARM-FPGA异构加速平台的细粒度可重构编译器ASCRA上展开相关设计
与验证。ASCRA(Application-SpecificCompilerforReconfigurableArchitecture)是基于开源编译
框架LLVM源码基础上进行开发,不仅在细粒度可重构编译器中实现循环程序流水硬件结构
映射时启动间距分析的自动化,提高了可重构计算应用的部署效率,还能够有效降低循环程
序在FPGA硬件上流水执行时因为RAW依赖关系产生的启动间距时钟等待延时,提高了循
环程序流水执行的性能。
发明内容
本发明的目的是提供一种能够减少循环流水执行时迭代间启动等待延时的,可重构编译
器中循环流水迭代间启动间距自动分析方法。
一种可重构编译器中循环流水迭代间启动间距自动分析方法,包括以下步骤,
步骤一:对计数类循环进行循环流水迭代间启动间距信息模型的构建,其中循环流水迭代间
启动间距信息模型包括SCoPs数据结构、RAW_DDA模型和非固定启动间距模型NF_II;
步骤二:将计数类循环的代码转换成SCoPs数据结构形式;
步骤三:根据计数类循环程序的SCoPs数据结构,进行循环流水迭代间写后读RAW数据依
赖关系分析,得到RAW_DDA模型描述的计数类循环程序的RAW数据依赖关系分析结果
RAW_DDA;
步骤四:基于计数类循环程序的RAW_DDA模型,进行循环流水迭代间启动间距的自动分析,
得到循环流水迭代间非固定启动间距模型NF_II描述的启动间距自动分析结果,得到启动间
距向量
II r → = ( II p r , II p r + θ r , ... , II pr + k · θ r , II pr + ( k + 1 ) · θ r , . . . , II qr ) ]]>
d e l a y ( s t m t ( I r → ) ) = δ r = m T ( L o o p ( r + 1 ) ) + δ r < m ]]>
T ( L o o p ( r ) ) = Σ k = 0 ( q m - p m ) / θ m II k II k ∈ II m → , r = m Σ k = 0 ( q m - p m ) / θ m ( T ( L ( r + 1 ) ) + II k ) II k ∈ II m → , 1 < r < m ]]>
II I m = 0 , I m = p m 1 , I m ≠ p m ]]>
其中,表示循环体中迭代点Ir=pr+k·θr与Ir=pr+(k+1)·θr之间的启动间
距;delay表示依赖关系next在循环Loop(r)中循环体迭代之间时钟延时;T(Loop(r+1))表示
在循环Loop(r)中索引变量为Ir时循环Loop(r+1)流水执行时的时钟周期。
本发明一种可重构编译器中循环流水迭代间启动间距自动分析方法还可以包括:
1、计数类循环为:索引变量向量其中m为多层循环的最大深度;Loop(r)
表示索引变量为Ir的循环,其中1≤r≤m,循环体用表示,表示
循环体由索引向量控制,索引变量Ir=(pr,qr,θr),其中,pr和qr分别表示索引变量Ir的
初值和终值,且是(I1,I2,...,Ir-1)的整值函数,θr表示循环变量Ir的增量且θr为常数。
2、SCoPs数据结构表示为:SCoPs由context和一系列声明statement构成一个二元组<Context,
[Statement]>,其中context是SCoP约束参数的集合;每个声明statement都是一个四元组
<Name,Domain,Schedule,[Access]>,Statement的单位是多层循环Loop中循环体
其中1≤r≤m,其中Name表示声明statement的名称;Domain是声明的迭代域,表示一个
statement在多层循环中的多维迭代空间域;Schedule是多维空间中迭代向量的整型映射,
表示迭代空间中statement的迭代向量;[Access]是声明中对数组元素的访存操作集合,主
要包括读、写、读写三种。
3、RAW_DDA模型是指:RAW_DDA=(statement,I,[Array],[NEXT]),其中RAW_DDA表示循环流
水迭代间数据依赖关系分析结果,statement表示多层循环程序中的一个循环体的
声明;I表示循环体索引变量Ir,1≤r≤m;[Array]是与索引变量Ir相关的RAW数据
依赖关系的数组集合,用Array(Ir)表示;[NEXT]表示statement声明中所有迭代间RAW
数据依赖关系集合,NEXT(Array(Ir))表示Array(Ir)中单个数组所引起的RAW数据依赖
关系集合,其中NEXT是一个三元组(next,δ,Δ),其中δ表示迭代间RAW数据依赖关系的
依赖距离,Δ表示依赖关系next在循环体中跨过的流水段延时。
4、非固定启动间距模型NF_II是指:多层循环中循环体迭代间启动间距信息用二维向量
表示,1≤r≤m,其中表示循环体在索引变量Ir
控制下流水启动时的延时向量,即循环体在迭代空间中迭代点(I1,I2,...,Ir,...,Im)与
(I1,I2,...,Ir+θr,...,Im)之间的启动延时按照字典顺序生成的迭代间启动间距向量。
有益效果:
现有细粒度可重构编译器采用指导语句方式生成迭代间固定启动间距,对于多层循环中不
同深度的循环Loop(r)所对应的启动间距模型可以表示成一个一维向量,如公式所示,其中
1≤r≤n。
I I → = ( II 1 , II 2 , ... , II r , ... , II m ) ]]>
假设所有循环体的启动时间单位都是t,则在采用指导语句生成固定启动间距方式的
流水硬件结构中,循环体相邻迭代之间等待时间II_Time。而采用非固定启动间距控制方式生
成的流水硬件结构中,相邻迭代之间的等待时间NF_II_Time。
I I _ T i m e = Π r = 1 m ( II r * ( ( q r - p r ) / θ r ) ) ]]>
N F _ I I _ T i m e = Π r = 1 m ( Σ k = 0 ( q r - p r ) / θ r II p r + k * θ r ) ]]>
在细粒度可重构编译器中,制导语句控制生成的固定启动间距模型中,手动设计的固定
启动间距IIr最佳值为非固定启动间距向量中的最大值,其中k是正整数。
II r = m a x ( II p r , II p r + θ r , ... , II p r + k * θ r , ... , II q r ) ]]>
可证明得出采用非固定启动间距方式能够减少多层循环流水执行时循环体每次迭代启
动等待时间,如所示。
II_Time≥NF_II_Time
由上可得知,采用本发明所提出的方法,能够有效的减少循环流水执行时迭代间启动等
待延时时间,从而提高循环程序流水执行时的性能。通过循环流水启动间距自动分析方法可
以得到更精准的循环性能评估结果,实现更高效的软硬件自动划分方法,同时在硬件代码自
动映射过程中,能够提高可重构计算应用到高性能循环硬件电路结构的部署效率,提高细粒
度可重构编译器的效率和推广。
附图说明
图1为嵌套循环及N=5时带依赖关系的迭代域;图1(a)为一个典型外层循环迭代间数据
相关的嵌套循环;图1(b)为当N=5时循环体的迭代域及迭代间的RAW数据依赖关系;
图2为N=5,II=3时循环流水运行时空图;
图3为N=5时变启动间距循环流水运行时空图;
图4为ASCRA系统架构图;
图5为计数类多层循环伪代码描述;
图6为计数类循环伪代码递归描述;
图7为计数类多层循环示例代码;
图8为示例代码的SCoPs结构。
具体实施方式
下面将结合附图对本发明做进一步详细说明。
在可重构混合计算系统中,由于FPGA的可定制性及硬件结构不确定性,导致无法直接
利用通用计算机系统结构中所设计的软件流水技术实现多层循环迭代间变启动间距控制。现
有细粒度可重构编译器在实现循环流水并行硬件结构映射时,主要采用语句制导的方法实现
迭代间流水启动间距的生成,为了体现本发明内容比现有可重构编译器在多层循环流水迭代
间启动间距实现方式上的改进之处,本部分采用一个多层嵌套循环的实例描述问题所在。
如附图1(a)所示,显示了一个典型外层循环迭代间数据相关的嵌套循环,当N=5时循环
体的迭代域及迭代间的RAW数据依赖关系如附图1(b)所示。细粒度可重构编译器在实现该
嵌套循环到可重构混合计算平台流水并行硬件结构自动映射时,将最内层循环体映射成为一
个处理单元(PE,ProcessElement),循环控制语句映射成为一个控制单元(CU,ControlUnit),实
现对每次迭代启动和结束时间的控制,循环流水控制单元的自动映射需要可重构编译器能够
采用自动分析算法获得每次迭代之间的启动间距信息。现有细粒度可重构编译器皆采用语句
制导方式人工指定迭代间启动间距约束条件,例如,Xilinx提供的VivadoHLS在实现附图1(a)
嵌套循环的流水并行硬件结构映射时,通过数次综合和仿真迭代,根据附图1(b)迭代域中迭
代体间RAW数据依赖关系可以得到如附图2所示的循环运行时空图,由迭代点(3,0)与迭代
点(4,0)之间的RAW依赖关系约束条件(如附图2中黑色箭头所示)选择索引变量i确定的循
环体迭代间最佳启动间距#pragmaII=3,通过这种指导语句的方式只能确定固定的启动间距大
小。
通过分析附图2所示时空图,可以发现图中灰色箭头所代表的RAW数据依赖关系所引起
的迭代间启动间距可以进行优化,通过对其启动间距进行手动优化后可以得到附图3所示的
循环流水运行时空图,外层循环迭代间启动间距由固定II=3变成非固定的启动间距向量
对多层循环外层循环迭代间采用非固定启动间距方式执行过程进行分析,可以得到
采用非固定启动间距策略能够提高循环程序硬件使用率13.7%,减少循环执行时钟周期19%。
通过分析细粒度可重构编译器中采用指导语句生成固定启动间距和非固定启动间距两种
循环迭代间流水控制策略,可以发现非固定启动间距控制策略能够更好地提高循环流水的性
能。但是,按照指导语句方式在细粒度可重构编译器中实现非固定启动间距控制方式对于用
户来说是非常困难的,针对每个多层循环应用程序都需要根据迭代间依赖关系手动分析得到
非固定值的启动间距向量,这种工作量对于用户来说是不可接受的。另外,在细粒度可重构
编译器中采用指导语句方式属于手动分析出迭代间最佳启动间距的方法,会在很大程度上由
于用户没有得到最佳的启动间距而无法提高循环程序映射生成更加的硬件结构,从而无法得
到良好的加速效果。这就迫切需要在细粒度可重构编译器中设计并实现一种能够自动得到迭
代间启动间距的方法。
针对这一现状,在细粒度可重构编译器ASCRA中,本发明提出了一种循环流水迭代间启
动间距自动分析方法,如附图4所示。本发明通过建立循环迭代间启动间距分析模型,并在
该分析模型的基础上设计实现自动分析算法,该算法理论上可以有效改善可重构编译器对可
重构计算应用的部署效率,还能有效提高循环流水硬件结构的性能,其中循环流水启动间距
分析模型由四部分组成:
1)计数类多层循环
定义:索引变量向量其中m为多层循环的最大深度;Loop(r)表示索引变量
为Ir的循环,其中1≤r≤m,循环体用表示,表示循环体由索引向量控制,
索引变量Ir=(pr,qr,θr),其中,pr和qr分别表示索引变量Ir的初值和终值,且是(I1,I2,...,Ir-1)的整值函
数,θr表示循环变量Ir的增量且θr为常数。
为了建立循环流水启动间距信息模型,需要将附图5所描述的多层循环Loop抽象成如附
图6所示多个单层循环递归表示的形式。其中Loop(m)表示最内层循环。
在细粒度可重构编译器ASCRA中是对中间代码IR进行数据依赖关系分析,将附图5所
示的高级语言描述形式转换成LLVM能够进行分析的数据结构,通过LLVMPASS将多层循
环描述成一种抽象语法树(AbstractSyntaxtree,AST),筛选符合定义1)中所描述限制条件的
计数类多层循环,实现附图5到附图6循环表示形式的抽象表示。
2)SCoPs
在本发明中用SCoPs(StaticControlParts)描述计数类多层循环模型中AST数据结构,其定
义如下:
SCoPs由context和一系列声明statement构成一个二元组<Context,[Statement]>。其中
context是SCoP约束参数的集合;每个声明statement都是一个四元组<Name,Domain,Schedule,
[Access]>,Statement的单位是多层循环Loop中循环体其中1≤r≤m,其中Name表示声
明statement的名称,是声明的唯一标识符;Domain是声明的迭代域,表示一个statement在
多层循环中的多维迭代空间域,限制了statement的迭代范围;Schedule是多维空间中迭代
向量的整型映射,表示迭代空间中statement的迭代向量;[Access]是声明中对数组元素的访
存操作集合,主要包括读、写、读写三种。
本发明提出的SCoPs数据结构基于LLVM开发的多面体模型分析程序开源软件Polly进
行设计,由于其能够准确的对不同深度循环体中数组元素访存操作进行描述,有利于对计数
类多层循环迭代间的数据依赖关系进行精确分析。例如,附图7中所示的多层循环可以用附
图8所示SCoPs表示,其中,循环Loop(i)中的循环体stmt(i)=Loop(j),所以Statement只描述
了的声明,
利用得到的SCoPs数据结构可以进行循环体迭代间数据依赖关系分析,本发明基于改进
后的ISL数据流分析方法,可以得到写后读(readafterwrite,RAW)、写后写(writeafterwrite,
WAW)、读后写(writeafterread,WAR)三种数据依赖关系。通过研究可以得出,在细粒度可重
构编译器中进行多层循环映射到流水硬件结构时,WAW和WAR数据依赖关系影响并行存储
体系结构的设计,而RAW数据依赖关系会影响到迭代间启动间距,因此本发明只考虑RAW
数据依赖关系分析结果。
3)RAW_DDA模型
在本发明中RAW_DDA模型用于描述RAW数据依赖关系,其定义如下:
RAW_DDA=(statement,I,[Array],[NEXT])。其中statement表示多层循环程序中的一个循环体
的声明;I表示循环体索引变量Ir,1≤r≤m;[Array]是与索引变量Ir相关的RAW数据依
赖关系涉及到的数组集合,用Array(Ir)表示;[NEXT]表示statement声明中所有迭代间RAW
数据依赖关系集合,用NEXT(Array(Ir))表示Array(Ir)中单个数组所引起的RAW数据依赖关系
集合,其中NEXT是一个三元组(next,δ,Δ),其中δ表示迭代间RAW数据依赖关系的依赖距离,
Δ表示依赖关系next在循环体中跨过的流水段延时。
基于数据依赖关系分析算法得到的RAW_DDA结果,本发明对多层循环中每一个循环体
进行迭代间启动间距分析,当循环体的索引变量Ir的边界pr或qr是变量时,会引起
迭代间的启动间距不是一个固定值,提出采用向量来表示迭代间启动间距信息,建立非固定
启动间距模型(None-FixedInitiationInterval,NF_II),如定义4)所描述。
4)NF_II模型
多层循环中循环体迭代间启动间距信息用二维向量表示,1≤r≤m。
其中表示循环体在索引变量Ir控制下流水启动时的延时向量,即循环体在迭代空
间中迭代点(I1,I2,...,Ir,...,Im)与(I1,I2,...,Ir+θr,...,Im)之间的启动延时按照字典顺序生成的迭代间启动间距
向量。
NF_II模型能够表示计数类多层循环中循环体每次迭代流水执行启动时的精确时间,
采用非固定启动间距的思想,实现细粒度可重构编译生成的多层循环流水硬件单元的时序控
制,能够有效减少多层循环流水执行时冒泡现象,提高多层循环流水执行的吞吐率。
在建立了分析模型之后,还需要为之建立相应的分析算法,以实现循环流水启动间距自
动分析方法之发明目的,分析算法的定义如下:
根据RAW_DDA得到的RAW数据依赖关系分析结果进行多层循环的迭代间启动间距分
析时,将多层循环按照附图6所示递归表示成多个单层循环的形式,Loop(r)中循环体迭
代之间启动间距是由与索引变量Ir相关的RAW数据依赖关系所决定,其中1≤r≤m,Loop(r)的启
动间距向量与索引变量Ir存在一对一仿射关系,如公式(1)所示,其中,k是正整数。
II r → = ( II p r , II p r + θ r , ... , II p r + k · θ r , ... , II q r ) ]]>式(1)
循环体中迭代点Ir=pr+k·θr与Ir=pr+(k+1)·θr之间的启动间距为启动间距由
NEXT(Array(Ir))决定,独立的数据依赖关系NEXT=(next,δ,Δ)与启动间距向量中每个启动
间距的关系如公式(2)所示,其中delay表示依赖关系next在循环Loop(r)中循环体迭代之
间时钟延时。
式(2)
d e l a y ( s t m t ( I r → ) ) = δ r = m T ( L o o p ( r + 1 ) ) + δ r < m ]]>式(3)
T ( L o o p ( r ) ) = Σ k = 0 ( q m - p m ) / θ m II k II k ∈ II m → , r = m Σ k = 0 ( q m - p m ) / θ m ( T ( L ( r + 1 ) ) + II k ) II k ∈ II m → , 1 < r < m ]]>式(4)
在循环Loop(r)中,根据RAW依赖关系next的依赖距离δ可以获得具有依赖关系next的
两次迭代之间的延时delay,如公式(3)所示,其中T(Loop(r+1))表示在循环Loop(r)中索引变
量为Ir时循环Loop(r+1)流水执行时的时钟周期。循环Loop(r)的两次迭代之间延时delay由最
内层循环Loop(m)的循环体以递归形式计算得到,循环Loop(m)的迭代间启动间距向量
为根据本文提出的非固定启动间距思想,在实现循环内部流水执行的同时,还可以实现
循环层间也进行流水执行,因此只考虑最内层循环流水启动时间,则最内层循环Loop(m)的
执行时间根据公式(4)可以计算得出。根据公式(5)可以从最内层循环逆向递归求出深度1<r≤m
的循环Loop(r)的运行时钟周期T。
根据如上所示多层循环中迭代间启动间距计算方法,本文在细粒度可重构编译器ASCRA
中设计实现了多层循环中循环体流水执行时迭代间启动间距自动分析算法。多层循环深度流
水执行时迭代间启动间距自动分析算法的伪代码描述如算法1所示。首先,对最内层循环
Loop(m)的启动间距向量进行分析。采用基于硬件延时的流水线划分算法对循环体进
行流水线划分;按照公式(5)对迭代间启动间距向量进行初始化;然后对的RAW_DDA
模型中数据依赖关系集合[NEXT]进行筛选,当Δ*θm≥δ时,则该依赖关系next会对循环体下一
次迭代执行产生推后影响,对符合该条件的next依赖关系进行遍历,根据公式(2)进行启动间
距向量的更新。
II I m = 0 , I m = p m 1 , I m ≠ p m ]]>式(5)
其次,根据Loop(m)的启动间距向量和T(Loop(m))对深度r=m-1的循环Loop(r)进行启
动间距向量的分析,最后按照公式(2-5)迭代求出多层循环的启动间距信息
根据上文建立的循环迭代间流水启动间距信息模型,可以准确的评估出多层循环流水执
行时的运行时钟周期,为细粒度可重构编译器中软硬件划分提供更加完善的划分依据信息,
同时采用该NF_II自动分析算法获得的多层循环深度流水执行时迭代间非固定启动间距信息
能够支持循环流水控制单元的生成。
在实现循环到流水硬件结构自动映射过程中,迭代间启动间距的自动分析技术是可重构
编译器研究的难点。在现有细粒度可重构编译器中,例如:VivadoHLS、ROCCC、ImpulseC
等,主要采用语句制导方式控制生成核心循环并行流水硬件结构的启动间距,该方法限制了
仅能以固定启动间距方式对循环流水进行控制,降低了并行流水硬件结构的性能,同时在确
定该迭代间启动间距时,需要迭代执行多次综合仿真过程才能确定,极大地制约了可重构计
算应用的开发效率,同时影响了细粒度可重构编译器在工业界的推广。正是针对上述编译器
的技术特性,本发明提出了一种可重构编译器中循环流水迭代间启动间距自动分析方法。该
方法通过建立循环流水执行时迭代间启动间距的分析模型,并采用自动生成算法得到迭代间
启动间距向量信息,可以有效减少流水冒泡延迟,提高硬件流水执行数据吞吐量,减少细粒
度可重构编译器调试启动间距值迭代次数,可有效提高可重构编译器的执行效率以及自动化
水平。实验结果表明,基于LLVM开源编译框架开发的细粒度可重构编译器ASCRA在采用
本自动分析方法后,与其他可重构编译器相比,实现了更高效的软硬件自动划分方法,同时
在硬件代码自动映射过程中,能够更加快速的得到高吞吐率的非固定启动间距循环硬件电路
结构,提高细粒度可重构编译器的开发效率和推广。
一种可重构编译器中循环流水迭代间启动间距自动分析方法,主要包括如下几个步骤:
步骤一:对计数类循环进行循环流水迭代间启动间距信息模型的构建,其中循环流水迭
代间启动间距信息模型包括SCoPs数据结构、RAW_DDA模型和非固定启动间距模型NF_II;
步骤二:将计数类循环的代码转换成SCoPs数据结构形式;
步骤三:根据计数类循环程序的SCoPs数据结构,进行循环流水迭代间写后读RAW数
据依赖关系分析,得到RAW_DDA模型描述的计数类循环程序的RAW数据依赖关系分析结
果RAW_DDA;
步骤四:基于计数类循环程序的RAW_DDA模型,进行循环流水迭代间启动间距的自动
分析,得到循环流水迭代间非固定启动间距模型NF_II描述的启动间距自动分析结果。其中,
公式(6)中表示循环体中迭代点Ir=pr+k·θr与Ir=pr+(k+1)·θr之间的启动间
距;公式(7)表示NEXT=(next,δ,Δ)与启动间距向量中每个启动间距的关系,delay表
示依赖关系next在循环Loop(r)中循环体迭代之间时钟延时;公式8)中T(Loop(r+1))表示在
循环Loop(r)中索引变量为Ir时循环Loop(r+1)流水执行时的时钟周期。
II r → = ( II p r , II p r + θ r , ... , II p r + k · θ r , II p r + ( k + 1 ) · θ r , ... , II q r ) ]]>式(6)
式(7)
d e l a y ( s t m t ( I r → ) ) = δ r = m T ( L o o p ( r + 1 ) ) + δ r < m ]]>式(8)
T ( L o o p ( r ) ) = Σ k = 0 ( q m - p m ) / θ m II k II k ∈ II m → , r = m Σ k = 0 ( q m - p m ) / θ m ( T ( L ( r + 1 ) ) + II k ) II k ∈ II m → , 1 < r < m ]]>式(9)
II I m = 0 , I m = p m 1 , I m ≠ p m ]]>式(10)
步骤一中所述的计数类循环描述为:索引变量向量其中m为多层循环
的最大深度;Loop(r)表示索引变量为Ir的循环,其中1≤r≤m,循环体用表示,
表示循环体由索引向量控制,索引变量Ir=(pr,qr,θr),其中,pr和qr分
别表示索引变量Ir的初值和终值,且是(I1,I2,...,Ir-1)的整值函数,θr表示循环变量Ir的增量
且θr为常数。
步骤一中所述的SCoPs数据结构表示为:SCoPs由context和一系列声明statement构成
一个二元组<Context,[Statement]>。其中context是SCoP约束参数的集合;每个声明statement
都是一个四元组<Name,Domain,Schedule,[Access]>,Statement的单位是多层循环Loop中
循环体其中1≤r≤m,其中Name表示声明statement的名称,是声明的唯一标识符;
Domain是声明的迭代域,表示一个statement在多层循环中的多维迭代空间域,限制了
statement的迭代范围;Schedule是多维空间中迭代向量的整型映射,表示迭代空间中
statement的迭代向量;[Access]是声明中对数组元素的访存操作集合,主要包括读、写、读
写三种。
步骤一中所述的RAW_DDA模型是指:RAW_DDA=(statement,I,[Array],[NEXT])。其中
RAW_DDA表示循环流水迭代间数据依赖关系分析结果,statement表示多层循环程序中的
一个循环体的声明;I表示循环体索引变量Ir,1≤r≤m;[Array]是与索引变量
Ir相关的RAW数据依赖关系涉及到的数组集合,用Array(Ir)表示;[NEXT]表示statement
声明中所有迭代间RAW数据依赖关系集合,用NEXT(Array(Ir))表示Array(Ir)中单个数组
所引起的RAW数据依赖关系集合,其中NEXT是一个三元组(next,δ,Δ),其中δ表示迭代间
RAW数据依赖关系的依赖距离,Δ表示依赖关系next在循环体中跨过的流水段延
时。
步骤一中所述的非固定启动间距模型NF_II是指:多层循环中循环体迭代间启动间距
信息用二维向量表示,1≤r≤m。其中表示循环体
在索引变量Ir控制下流水启动时的延时向量,即循环体在迭代空间中迭代点
(I1,I2,...,Ir,...,Im)与(I1,I2,...,Ir+θr,...,Im)之间的启动延时按照字典顺序生成的迭代间启动间距
向量。
为了验证本发明所提出的可重构编译器中循环流水迭代间启动间距自动分析方法的有
效性,本发明在基于ARM-FPGA异构加速平台的细粒度可重构编译器ASCRA
(Application-SpecificCompilerforReconfigurableArchitecture)上进行了具体的技术实施方案
实现。
ASCRA基于开源编译框架LLVM源码基础上进行开发,可以实现C-to-VHDL的自动
映射,ASCRA系统架构图如附图4所示。首先,将计算密集型应用程序编译成LLVM中
间代码(IR,IntermediateRepresentation)表示,采用一些前端优化技术进行IR优化;其
次,对循环程序进行数据依赖关系分析、流水线划分、流水启动间距分析和优化,基于流
水线划分结果和启动间距分析结果进行循环程序代价评估,评估将该循环程序映射到
FPGA上执行时消耗的代价和获得的应用加速比;然后,基于循环程序代价评估结果进行
软硬件划分,判断是否将其划分到协处理器FPGA硬件加速单元上执行;最后进行代码生
成,结合并行编译优化技术和并行存储模型完成FPGA并行流水硬件加速单元VHDL代码
的生成,同时生成软硬件接口驱动程序和将该循环程序封装成接口调用的C源程序,完成
异构加速平台对计算密集型C应用程序的加速。
本发明所提出的循环流水迭代间启动间距自动分析方法在ASCRA编译器中,具体伪代
码如算法1所示。
通过算法1所描述的实施过程,能够在可重构编译器工具中自动生成循环流水迭代间
非固定启动间距模型信息。