一种面向类仿射数组下标应用的参数化并行存储结构模版的制作方法_3

文档序号:8942896阅读:来源:国知局
r_depth。为了能根据存储模板规则编译生成参数化的并行存储结构, 本发明提出了访存数据依赖图的定义及面向类仿射数组下标应用的访存数据依赖图生成 算法,编译时根据访存数据依赖图中节点的属性信息,计算生成模板中的各参数值。
[0058] 本发明的一种面向类仿射数组下标应用的参数化并行存储结构模板的访存数据 依赖图生成算法如下:
[0059] 定义1访存数据依赖图。访存数据依赖图MDDG = (V,E,R),其中V为节点集合,E 为连接相邻节点的有向边,R为数据重用度.
,即循环迭代空间 内数组元素七,-為+.~_,)]进行了 Load或Store操作,每个
存在一个数据重用度
,表示节点
每隔
次循环迭代就会同节点
发生对同一存储 地址的读写。
[0060] 算法1 :访存数据依赖图生成算法
[0061] ASCRA编译器首先采用llvm-gcc将C语言应用程序转换为SSA(Static Single Assignment)形式的IR (Intermediate Representation)中间表不形式,然后将IR程序映 射生成硬件结构。因此,本发明提出的访存数据依赖图生成算法的输入指令集为IR代码 (如果程序进行循环展开操作,则输入指令集为循环展开后的IR代码)。由于本发明主要 研究只有层内数据重用的仿射类数组下标应用,因此,参与循环运算的数组下标可简化表 示为ai+b,i为循环索引变量。
[0062]步骤:
[0063] (1)遍历程序中进行Load和Store操作的所有数组元素,根据数组名,分别将其划 分到不同的集合&中,X = 1…n,表示有程序中存在不同名的数组个数,根据操作属性将数 组元素 A[ai+b]表示为LA [ai+b](进行Load操作)或SA[ai+b](进行Store操作),将其插入到集 合G x中;
[0064] (2)遍历集合&中的元素,获得数组元素下标斜率A = {a I a为数组元素下标斜 率},当所有进行Store操作的数组元素 SA[ai+b]具有相同的下标斜率,或不存在进行Store 操作的数组元素,则将集合&中数组元素按不同下标斜率划分到不同集合Sxa中,a = 1··· N,表示不同的数组下标斜率,如果存在η个不同的数组下标斜率,则需要备份η份访存数 据,之后执行步骤(3);当数组元素 SA[al+b]存在不同的下标斜率a时,将集合6:(中数组元素 按不同下标斜率划分到不同集合S xan中,m = a,执行步骤(4);
[0065] (3)依次遍历不同集合Sxa中的数组元素,R表示数组下标截距模数据步长k同 余的数组元素之间的关系,数据步长表示每次循环迭代时数组元素增加的地址间隔,k = a*Stepi,Stepi表示循环步长.R为集合Sa上的等价关系,对任何数组元素 XA [ai+b]e Sxk,集 合
简化表示为Sxam,m = 1…k-Ι,表示模数据步长 k的余数,
[0066] (4)将每个集合Sxall^ S Λ中的数组元素 XA [al+b]按类仿射数组下标的截距从小 到大进行排序,当循环迭代空间存在写后读相关,删除进行Load操作的数组元素;当进行 Load操作的数组元素与进行Store操作的数组元素具有相同数组下标时,将进行Store操 作的数组元素排在进行Load操作的数组元素前面,如果这两个数组元素之间存在迭代内 写后读相关,则从集合中删除进行Load操作的数组元素;
[0067] (5)遍历集合Sxam或Sxftll中的数组元素,每当遍历到进行Store操作的数组元素时, 都将其及之前的所有数组元素构成一个新的集合S X_S S xftm (n = I. .. N,表示第η个新集 合),按此规则继续遍历剩余的数组元素,直到遍历完集合中的所有数组元素,如果不存在 进行Store操作的数组元素,则剩余的数组元素构成一个新的集合;
[0068] (6)计算集合Sx_或S xam中每两个相邻数组元素之间的数据重用度 R〈XA[ai+b], XA[ai+(:]>,如式⑴所示,如果集合Sxamn中只有一个数组元素,则不计算数据重用 度。
[0069]
[0070] 式⑴中,不能整除时,R〈XA[al+b],XA[al+c]> = 0· Δ d〈XA[al+b],XA[al+c]> 表示一次循环 迭代内数组元素之间的距离:I c-b I ;
[0071] (7)依次遍历数据重用度R,如果存在R〈XA[al+b],XA[al+d> = 0,则继续划分集合,将 XA[ai+b]及之前的所有数组元素构成一个新的集合Sxamnv或Sxftmv (V = I. . .N,表示第V个新集 合),按此规则继续遍历剩余的数组元素,直到遍历完集合中的所有数组元素,如果不存在 数据重用度R = 0的情况,则集合Sxanin或S xftm中剩下的数组元素构成一个新的集合S X_VS O · 〇x0mnv,
[0072] (8)生成访存数据依赖图MDDGxaninv集合:每个集合S x_^ S xQ_中的数组元素 为访存数据依赖图MDDGxaninv或MDDGxamv中一个节点,其中第一个节点为根节点,从根节 点开始依次指向其后序节点,最后一个节点为叶子节点,每条边上的权值为数据重用度 R〈XA[al+b],XA[al+d>,生成的访存数据依赖图的个数等于集合S xamnvS S xamv的个数。
[0073] 本发明的一种面向类仿射数组下标应用的参数化并行存储结构模板的模板参数 计算方法如下:
[0074] 根据访存数据依赖图,为每个不同名的数组生成参数化并行存储结构所需参数 值:(1)多体交叉存取度:Ram_num;(2)存储体深度:Ram_cbpth;(3)存储体位宽:Ram_ width; (4) RAW Bufffer 个数:RBuff er_num; (5) RAW Bufffer 深度:RBuff er_depth; (6) Smart Buffer 个数:SBuffer_num;(7)Smart Buffer 深度:Register_num.设输入的数组 元素个数Arrary_depth ;输入的数组元素位宽I_width。
[0075] (1)多体交叉存储度Ram_num
[0076] 生成访存数据依赖图过程中,如果集合SxaJ勺个数为n,或者集合S ^的个数为m, 计算RAM的多体交叉存储度Ram_num的公式如(3)所示.当Ram_num等于1时,硬件结构 为单体串行结构。
[0077] (3)
[0078] (2)存储体深度 Ram_depth
[0079] 计算方法如式(4)。
[0080] Ram_depth = Arrary_depth/Ram_num (4)
[0081] (3)存储体位宽 Ram_width
[0082] 计算方法如式(5)。
[0083] Ram_width = I_width (5)
[0084] (4) RAW Buffer 结构个数 RBuffer_num
[0085] 如果访存数据依赖图集合中存在流依赖的访存数据依赖图有f个,根据参数化并 行存储模板规则,为重用数据生成RAW Buffer结构.其RAW Buffer结构的个数等于有流 依赖的访存数据依赖图中的叶子节点的个数f,如式(6)。
[0086] RBuffer_num = f (6)
[0087] (δ) RAW Bufffer 深度 RBuff er_depth
[0088] 为具有流依赖的输入数据设计RAW Buffer结构,每个RAW Buffer结构的深度由 进行Store操作的数组元素所在数据通路中的流水段号(Ln)同访存数据依赖图中叶子节 点(SA [al+d])和其相连节点(LA[al+b])间的数据重用度R〈LA[al+b],SA [al+d]>的关系来确定,如式 (7)。
[0089] (7)
[0090] 式(7)中RBuffer_depth = 0表示直连线,不生成寄存器。
[0091] (6) Smart Buffer 结构个数 SBufTer_num
[0092] Smart Buffer的个数等于访存数据依赖图中划分出的集合个数S,如式(8)。
[0093] SBuffer_num = S (8)
[0094] (7〇 Smart Buffer 结构深度 Register_num
[0095] 在含流依赖的访存数据依赖图中,其叶子节点生成的数据存储在RAW Buffer中, 非叶子节点中所需的数据从Smart Buffer中读取,此时Smart Buffer的深度如式(9)所 不。
[0096] Register_num = Σ Rxkmnv-RBuffer_depth+l (9)
[0097] 其中,Σ Rkmnv表示集合S xkmnv (v = v。,…,vn)对应的访存数据依赖图中相邻节点数 据重用度之和。
[0098] 在含输入依赖(或只有单节点)的访存数据依赖图中,其叶子节点数据需要从并 行存储结构中读取,并行读取的数据需要存储到相应Smart Buffer中,此时Smart Buffer 的深度如式(10)所示。
[0099]
[0100] 为了进一步阐明如何根据访存依赖图及参数化存储模板生成具体的硬件存储结 构,本发明以图1中类仿射型数组下标应用示例代码论述具体实现思路。
[0101] 1、访存数据依赖图生成算法的应用
[0102] 如图1所示,代码段中只有一个数组A,依据访存数据依赖图生成算法对数组A进 行访存数据依赖图生成,数组A的下标可以表示为ai+b,其中a = 1,b为常数,i为循环索 引变量。
[0103] 访存数据依赖图生成步骤:
[0104] (1)遍历代码段中进行Load和Store操作的所有数组元素,每次循环迭代时进 行Load操作的数组元素为A[i],A[i+1],A[i+3],A[i+6],进行Store操作的数组元素为 A[i+2]。根据数组名,可以生成数组A对应的一个集合G1,根据操作属性将集合G1表示成 {LA[i],LA[i+l],LA[i+3],LA[i+6],SA[i+2]} 〇
[0105] (2)遍历集合61中的元素,获得数组元素 A的下标斜率集合A= {a|a= 1},将斜率 相同的数组元素划分到同一个集合中,得到集合S11= {LA[i],LA[i+l],LA[i+3],LA[i+6], SA[i+2] },因为只有一种斜率a = 1。
[0106] (3)因为代码段中循环的变量递增式为i = i+1,因此该循环的数据步长k = 1, 根据数组下标截距模数据步长k同余的数组元素之间的关系划分集合sn,因为下标模数 据步长k的余数m = 0,只有一个余数,
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1