具体实施方式
下面详细描述本发明的实施例,实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
图1为根据本发明一个实施例的处理器循环映射的优化方法的流程图。如图1所示,根据本发明实施例的处理器循环映射的优化方法,包括以下步骤:
步骤S101,获取循环程序阵列,并对循环程序阵列进行处理以获得循环程序阵列中语句之间的依赖关系和变换关系。
具体地,获取所要处理的循环程序,并将其转化为多面体表示。该转换方法可以用Clan(the Chunky loop analyzer)工具把高级语言中(C,C++)的循环抽象并转换成多面体的中间表示。在循环的多面体中间表示的基础上,我们也用现有的工具Candl(theChunky analyzer for dependences in loops)来精确地分析循环的依赖关系。在本发明中只分析写后写,写后读和读后写依赖。经过处理便可得到数据依赖图(DDG)。DDG是一个有向图。图中每一个顶点代表一条语句,每一条边代表语句之间的依赖。例如,从顶点S
i到S
j的边e∈E表示从语句S
i的动态实例到S
j的动态实例的数据依赖。这个可以精确的数据依赖信息就可以通过依赖多面体P
e表示出来。在依赖多面体中,把数据依赖的目标迭代向量
映射到该数据依赖的源迭代向量
的转换叫做h变换,得到变换关系,如此便有
成立。通过分析,可以得到循环中的每一组语句之间的依赖
以及从
到
的变换关系。
在本发明的一个实施例中,采用REMUS对循环程序进行处理,REMUS是一个可重构多媒体处理器,它的每一个RPU拥有四个8X8的RCA阵列,其工作频率为200MHz。为了展示出基于多面体模型的循环优化的具体过程,这里我们以理想的1-D Jacobi为例子,如下面的程序所示,
for(i=1;i<N;i++)
for(j=2;j<N-1;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1]+a[i-1][j+1];\\S1
对其进行处理可得到如下关系。
flow:a[i′][j′]→a[i-1][j]
h:i′=i-1,j′=j;D1:1≤i≤N-1,2≤j≤N-2
flow:a[i′][j′]→a[i-1][j-1]
h:i′=i-1,j′=j-1;D2:1≤i≤N-1,2≤j≤N-2
flow:a[i′][j′]→a[i-1][j+1]
h:i′=i-1,j′=j+1;D3:1≤i≤N-1,2≤j≤N-2。
步骤S102,对依赖关系和变换关系进行处理以生成第一超平面和第二超平面,其中,第一超平面和第二超平面相互独立。
具体地,在RCA内部数据依赖是有限制的,按照控制顺序,P
e的执行顺序是一行接一行的。因此我们要寻找第一超平面Θ使得所有的依赖都至少跨越一层超平面,因此时间控制限制条件可以描述为,
其中,
和
是分别表示依赖关系的变量,P
e表示依赖多面体。通过公式推导出一个优化目标公式可表示为,
其中,h
e表示变换关系,Θ表示变量的线性组合,
表示依赖e所跨越的超平面Θ的层数。再通过边界函数的方法优化目标,使循环变量在全局参数
的控制范围之内,优化函数可表示为,
其中,w表示一个边界函数v的常量项,
表示循环中所有的常量参数,
表示一个向量。最后,根据寻找minimize<(w,c
1,c
2)的最小词典序得到最优的循环变换参数,并利用上述约束生成第一超平面。
在本发明的一个实施例中,得到第一超平面之后,我们接下来就要寻找一个独立于第一超平面的第二超平面来划分一个二维的嵌套循环。第二超平面与第一超平面不同,第二超平面是用来分割RCA的不同列,因此没有时间上的执行先后顺序要求。其空间约束可以表示为,
其中,
和
是分别表示依赖关系的变量,S为源语句,T为目标语句,Π表示迭代变量的线性组合,即
且d1和d2为不为0的整数,P
e表示依赖多面体。
在本发明的一个实施例中,通过上述时间约束和空间约束条件,限制两个超平面将嵌套循环进行分块,同时保证“块”与“块”之间只有单向的数据依赖,使得“块”在RCA上面合法执行。为了保证第二超平面Π与第一超平面Θ相互独立,通过两个超平面的变换系数进行约束,其约束表示为,c
1d
2-c
2d
1>0or c
1d
2-c
2d
1<0,其中,c1和c2表示第一超平面的参数,d1和d2表示第二超平面的参数。再通过边界函数的方法优化目标,使循环变量在全局参数
的控制范围之内,优化函数可表示为,
其中,w'表示一个边界函数v的常量项,
表示循环中所有的常量参数,
表示一个向量。最后,根据寻找minimizc<(w′,d
1,d
2)的最小词典序得到最优的循环变换参数,并利用上述时间约束、空间约束和超平面的系数约束生成第二超平面。
在寻找超平面Π的过程中,改变约束(1),新增加正交约束(6),按照寻找超平面Θ的方法,应用PIP工具软件,我们就得出了超平面Π的变换系数(d1d2)了。
以上述for循环程序为例,语句之间得到依赖关系和转换关系之后,其约束可表示为,
(1) 其边界约束是w-ci≥0,因为是一个常数依赖。
(2) 其边界约束是w-ci-cj≥0。
(3) 其边界约束是ω-ci+cj≥0。
归纳所有的约束和优化目标,可得到如下约束关系:
ci≥1
w-ci≥0
ci+cj≥1
w-ci-cj≥0
ci-cj≥1
w-ci+cj≥0
minimize<(w,ci,cj)。
向量(w,ci,cj)的词典序最小的是(1,1,0)。这样,我们得到ci=1,cj=0,即c1=1,c2=0。
第二超平面的也类似,加上空间划分约束和独立约束,按照寻找超平面Θ的方法即可得到第二超平面Π的变换参数其结果为,ci=1,cj=0,即d1=1,d2=0。
步骤S103,根据第一超平面和第二超平面将循环程序阵列划分为多个块以完成对处理器循环映射的优化。
具体地,通过所获得的第一超平面和第二超平面改变循环程序的PE阵列。由于循环体的规模是非常大的,而PE阵列往往是有限大小的,为了让一个大的嵌套循环在PE阵列上面去执行,就需要根据PE阵列的大小对嵌套循环进行分块以完成对处理器循环映射的优化。
现在我们就可以去确定分块的大小了。这里我们也以8X8的PE阵列为例,如果循环体语句只有一个算子,那么一次循环迭代就可以映射到一个PE上面去。实际上在很多情况下,循环体语句不只是一个算子。这种情况下,我们通过分析循环体语句内部的算子及其依赖情况就可以确定循环体语句的长宽比ζs/ηs,其中,ζs表示PE阵列的长,ηs表示PE阵列的宽。循环分块的长宽比L/W应该与语句的长宽比ζs/ηs成反比例。其循环
Ltile=LRCA/ζs
分块的大小通过如下公式获得,Wtile=WRcA/ηs,其中,LRCA表示可重构计算阵列(RCA)的长,WRCA表示可重构计算阵列(RCA)的宽。
图2为根据本发明一个实施例的循环程序中原始迭代空间的示意图。如图2所示,通过所获得的第一超平面和第二超平面改变循环程序的PE阵列,如图3所示。只有在循环网络边缘的分块,例如,T0、T1、T2和T4不是规则的,内部的分块,例如T3都是规则的。事实上,当循环的规模很大的时候,规则分块的数量是占绝大部分的比例。图4为根据本发明一个实施例的分块被映射到RCA的示意图。如图4所示,一个完整的规则的分块就被映射到一个RCA8X8上面去了,图4中带圈的"+"表示算子1,带网格的"+"表示算子2,带框的R表示临时寄存器。
根据本发明实施例的方法,通过循环程序阵列中语句之间的依赖关系和变换关系生成两个超平面,并通过该超平面对循环程序进行划分,从而提高了阵列的处理单元利用率减少了运算次数,同时降低了阵列之间的通信量,减少数据的载入和存储时间。
图5为根据本发明另一个实施例的处理器循环映射的优化系统的框架图。如图5所示,根据本发明实施例的处理器循环映射的优化系统包括获取模块100、处理模块200和划分模块300。
获取模块100用于获取循环程序阵列,并对循环程序阵列进行处理以获得循环程序阵列中语句之间的依赖关系和变换关系。
具体地,获取所要处理的循环程序,并将其转化为多面体表示。该转换方法可以用Clan(the Chunky loop analyzer)工具把高级语言中(C,C++)的循环抽象并转换成多面体的中间表示。在循环的多面体中间表示的基础上,我们也用现有的工具Candl(theChunky analyzer for dependences in loops)来精确地分析循环的依赖关系。在本发明中只分析写后写,写后读和读后写依赖。经过处理便可得到数据依赖图(DDG)。DDG是一个有向图。图中每一个顶点代表一条语句,每一条边代表语句之间的依赖。例如,从顶点S
i到S
j的边e∈E表示从语句S
i的动态实例到S
j的动态实例的数据依赖。这个可以精确的数据依赖信息就可以通过依赖多面体P
e表示出来。在依赖多面体中,把数据依赖的目标迭代向量
映射到该数据依赖的源迭代向量
的转换叫做h变换,得到变换关系,如此便有
成立。通过分析,可以得到循环中的每一组语句之间的依赖
以及从
到
的变换关系。
在本发明的一个实施例中,采用REMUS对循环程序进行处理,REMUS是一个可重构多媒体处理器,它的每一个RPU拥有四个8X8的RCA阵列,其工作频率为200MHz。为了展示出基于多面体模型的循环优化的具体过程,这里我们以理想的1-D Jacobi为例子,如下面的程序所示,
for(i=1;i<N;i++)
for(j=2;j<N-1;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1]+a[i-1][j+1];\\S1
对其进行处理可得到如下关系。
floω:a[i′][j′]→a[i-1][j]
h:i′=i-1,j′=j;D1:1≤i≤N-1,2≤j≤N-2
flow:a[i′][j′]→a[i-1][j-1]
h:i′=i-1,j′=j-1;D2:1≤i≤N-1,2≤j≤N-2
flow:a[i′][j′]→a[i-1][j+1]
h:i′=i-1,j′=j+1;D3:1≤i≤N-1,2≤j≤N-2。
处理模块200用于对依赖关系和变换关系进行处理以生成第一超平面和第二超平面,其中,第一超平面和第二超平面不重合。
具体地,在RCA内部数据依赖是有限制的,按照控制顺序,P
e的执行顺序是一行接一行的。因此我们要寻找第一超平面Θ使得所有的依赖都至少跨越一层超平面,因此时间控制限制条件可以描述为,
其中,
和
是分别表示依赖关系的变量,P
e表示依赖多面体。通过公式推导出一个优化目标公式可表示为,
其中,h
e表示变换关系,Θ表示变量的线性组合,
表示依赖e所跨越的超平面Θ的层数。再通过边界函数的方法优化目标,使循环变量在全局参数
的控制范围之内,优化函数可表示为,
其中,w表示一个边界函数v的常量项,
表示循环中所有的常量参数,
表示一个向量。最后,根据寻找minimize<(w,c
1,c
2)的最小词典序得到最优的循环变换参数,并利用上述约束生成第一超平面。
在本发明的一个实施例中,得到第一超平面之后,我们接下来就要寻找一个独立于第一超平面的第二超平面来划分一个二维的嵌套循环。第二超平面与第一超平面不同,第二超平面是用来分割RCA的不同列,因此没有时间上的执行先后顺序要求。其空间约束可以表示为,
其中,
和
是分别表示依赖关系的变量,S为源语句,T为目标语句,Π表示迭代变量的线性组合,即
且d1和d2为不为0的整数,P
e表示依赖多面体。
在本发明的一个实施例中,通过上述时间约束和空间约束条件,限制两个超平面将嵌套循环进行分块,同时保证“块”与“块”之间只有单向的数据依赖,使得“块”在RCA上面合法执行。为了保证第二超平面Π与第一超平面Θ相互独立,通过两个超平面的变换系数进行约束,其约束表示为,c
1d
2-c
2d
1>0or c
1d
2-c
2d
1<0,其中,c1和c2表示第一超平面的参数,d1和d2表示第二超平面的参数。再通过边界函数的方法优化目标,使循环变量在全局参数
的控制范围之内,优化函数可表示为,
其中,w'表示一个边界函数v的常量项,
表示循环中所有的常量参数,
表示一个向量。最后,根据寻找ninimize<(w′,d
1,d
2)的最小词典序得到最优的循环变换参数,并利用上述时间约束、空间约束和超平面的系数约束生成第二超平面。
在寻找超平面Π的过程中,改变约束(1),新增加正交约束(6),按照寻找超平面Θ的方法,应用PIP工具软件,我们就得出了超平面Π的变换系数(d1d2)了。
以上述for循环程序为例,语句之间得到依赖关系和转换关系之后,其约束可表示为,
(1) 其边界约束是w-ci≥0,因为是一个常数依赖。
(2) 其边界约束是w-ci-cj≥0。
(3) 其边界约束是ω-ci+cj≥0。
归纳所有的约束和优化目标,可得到如下约束关系:
ci≥1
w-ci≥0
ci+cj≥1
w-ci-cj≥0
ci-cj≥1
w-ci+cj≥0
minimize<(w,ci,cj)。
向量(w,ci,cj)的词典序最小的是(1,1,0)。这样,我们得到ci=1,cj=0,即c1=1,c2=0。
第二超平面的也类似,加上空间划分约束和独立约束,按照寻找超平面Θ的方法即可得到第二超平面Π的变换参数其结果为,ci=1,cj=0,即d1=1,d2=0。
划分模块300用于根据第一超平面和第二超平面将循环程序阵列划分为多个块以完成对处理器循环映射的优化。
具体地,通过所获得的第一超平面和第二超平面改变循环程序的PE阵列。由于循环体的规模是非常大的,而PE阵列往往是有限大小的,为了让一个大的嵌套循环在PE阵列上面去执行,就需要根据PE阵列的大小对嵌套循环进行分块以完成对处理器循环映射的优化。
现在我们就可以去确定分块的大小了。这里我们也以8X8的PE阵列为例,如果循环体语句只有一个算子,那么一次循环迭代就可以映射到一个PE上面去。实际上在很多情况下,循环体语句不只是一个算子。这种情况下,我们通过分析循环体语句内部的算子及其依赖情况就可以确定循环体语句的长宽比ζs/ηs,其中,ζs表示PE阵列的长,ηs表示PE阵列的宽。循环分块的长宽比L/W应该与语句的长宽比ζs/ηs成反比例。其循环
Ltile=LRCA/ζs
分块的大小通过如下公式获得,Wtile=WRCA/ηs,其中,LRCA表示可重构计算阵列(RCA)的长,WRCA表示可重构计算阵列(RCA)的宽。
图2为根据本发明一个实施例的循环程序中原始迭代空间的示意图。如图2所示,通过所获得的第一超平面和第二超平面改变循环程序的PE阵列,如图3所示。只有在循环网络边缘的分块,例如,T0、T1、T2和T4不是规则的,内部的分块,例如T3都是规则的。事实上,当循环的规模很大的时候,规则分块的数量是占绝大部分的比例。图4为根据本发明一个实施例的分块被映射到RCA的示意图。如图4所示,一个完整的规则的分块就被映射到一个RCA8X8上面去了,图4中带圈的"+"表示算子1,带网格的"+"表示算子2,带框的R表示临时寄存器。
根据本发明实施例的系统,通过循环程序阵列中语句之间的依赖关系和变换关系生成两个超平面,并通过该超平面对循环程序进行划分,从而提高了阵列的处理单元利用率减少了运算次数,同时降低了阵列之间的通信量,减少数据的载入和存储时间。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在不脱离本发明的原理和宗旨的情况下在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。