CN101452394B - 编译方法和编译器 - Google Patents
编译方法和编译器 Download PDFInfo
- Publication number
- CN101452394B CN101452394B CN 200710094327 CN200710094327A CN101452394B CN 101452394 B CN101452394 B CN 101452394B CN 200710094327 CN200710094327 CN 200710094327 CN 200710094327 A CN200710094327 A CN 200710094327A CN 101452394 B CN101452394 B CN 101452394B
- Authority
- CN
- China
- Prior art keywords
- instruction
- transformation
- circulation
- loop unrolling
- execution unit
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Abstract
一种编译方法和编译器。所述编译方法包括:识别包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且所有的第一指令不存在迭代间的相关性;统计所述循环中第一指令和第二指令的指令数,并根据第一指令执行部件和第二指令执行部件的执行能力计算循环展开次数和第一指令转换成第二指令的循环次数;若所述循环展开次数不等于1,对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令。所述编译方法和编译器可以充分利用处理器中的指令执行部件的并行性,提高程序的执行效率,减轻用户的编程负担。
Description
技术领域
本发明涉及编译方法和编译器,特别是涉及一种针对包含单指令多数据扩展指令执行部件的处理器的编译方法和编译器。
背景技术
随着多媒体应用的广泛发展,现在很多嵌入式处理器都支持多媒体扩展指令集。多媒体扩展一般都具有一种单指令多数据(SIMD,Single InstructionMultiple Data)体系结构,这种结构基于一种短的、固定长度的向量,通常为64位或128位,多个数据存储在一个寄存器或存储单元中。
以往的简单指令只能一次处理8位、16位、32位或64位的数据操作,现在随着128位超字的出现,SIMD结构可以在一条指令中并行地处理4个32位的数据操作或8个16位的数据操作,例如一个4x32位的SIMD加法指令vs=vs+vb的操作实例如图4所示。
SIMD指令集的出现为程序性能的提升带来了巨大的潜力,通常认为,如果不去使用SIMD扩展指令,那么50%-75%的处理器能力都被浪费了。使用这种SIMD指令集的最理想的方法是编译器能进行自动识别,针对普通的程序,编译器尽可能地识别出程序中能使用SIMD指令的部分,从而自动生出SIMD指令,达到加速的目的。该技术不需要用户参与,但现阶段仍受限于SIMD识别率不高,适用性比较差。目前用的最多的方法是通过内嵌汇编或库调用的方法使用SIMD扩展指令集;直接使用内嵌汇编的方法不利于编译器的优化,编译出来的目标程序代码效率比较低,所以一般都针对SIMD扩展指令集提供扩展类型和一组扩展的编译器内部函数接口,例如针对4x32的SIMD指令可以增加一种扩展类型:intv4,4x32的SIMD加法就可以在程序中表示成:
intv4 va,vb,vc
vc=va+vb;
调用编译器内部函数接口是目前使用SIMD扩展指令最为普遍和有效的方法,能够保证SIMD运算能进行常规的编译器优化。
在SIMD扩展指令硬件实现方法上,现在最常用的是在已有简单指令执行部件的处理器中,再单独增加SIMD指令执行部件(例如龙芯)。这种处理器的简单指令执行部件和增加的SIMD指令执行部件可以独立发射指令和并行执行,这时若程序可以充分利用简单指令执行部件和SIMD指令执行部件的并行性,能明显提高程序的执行效率。
如何充分利用好简单指令执行部件和SIMD指令执行部件,这需要用户在撰写包含有SIMD指令的程序过程中,同时考虑用好简单指令执行部件,合理分配简单指令执行部件和SIMD指令执行部件的工作量。但是,由用户在撰写程序过程中考虑如何充分利用好简单指令执行部件和SIMD指令执行部件会存在以下问题:
1.用户负担太重。在程序中显式地使用扩展数据类型和调用扩展内部函数接口,这对用户已是一种很大的负担。还需额外考虑部件之间工作量平衡,这要求用户对系统非常了解,难度非常大。
2.可移植性较差。只要简单指令执行部件和SIMD指令执行部件的执行能力有变化,原来的程序就不能很好的适用,这里所说的执行部件的执行能力是指每个时钟周期发射的指令数,其是由执行部件的硬件设计实现的。
发明内容
本发明解决的问题是,提供一种编译方法和编译器,以充分利用处理器中的指令执行部件的并行性,提高程序的执行效率,减轻用户的编程负担。
为解决上述问题,本发明提供一种编译方法,包括下述步骤:
识别包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性;
统计所述循环中第一指令和第二指令的指令数;
根据所述循环中的第一指令和第二指令的指令数、以及第一指令执行部件和第二指令执行部件的执行能力,计算循环展开次数和第一指令转换成第二指令的循环次数;
若所述循环展开次数不等于1,根据所述循环展开次数对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令。
可选的,所述第一指令是单指令多数据定点指令,第二指令是简单定点指令。
可选的,所述第一指令是单指令多数据浮点指令,第二指令是简单浮点指令。
可选的,所述循环的控制参数包括上界、下界和步长。
可选的,所述循环展开次数、第一指令转换成第二指令的循环次数根据下面的条件计算:循环展开和指令转换后的第一指令的指令数与第二指令的指令数的比值约等于第一指令执行部件的执行能力与第二指令执行部件的执行能力的比值,所述循环展开和指令转换后的第二指令的指令数为(unroll*l+trans*n),第一指令的指令数为((unroll-trans)*m),其中,unroll为循环展开次数,trans为第一指令转换成第二指令的循环次数,l为所述循环中第二指令的指令数,m为所述循环中第一指令的指令数,n为将m条第一指令转换得到的第二指令的指令数。
可选的,根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令是指将所述循环展开中的前trans次循环体的第一指令转换成对应的第二指令。
可选的,根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令是指将所述循环展开中的后trans次循环体的第一指令转换成对应的第二指令。
可选的,所述编译方法还包括对所述循环展开和指令转换后的循环进行指令调度。
为解决上述问题,本发明还提供一种编译方法,包括下述步骤:
查找到一个未处理的包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性;
统计所述循环中第一指令和第二指令的指令数;
根据所述循环中的第一指令和第二指令的指令数、以及第一指令执行部件和第二指令执行部件的执行能力,计算循环展开次数和第一指令转换成第二指令的循环次数;
若所述循环展开次数不等于1,根据所述循环展开次数对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令;
若所述循环展开次数等于1,继续查找下一个未处理的包含第一指令的循环,重复上述步骤。
对应于上述编译方法,本发明还提供一种编译器,包括:
识别模块,用于识别包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性;
统计模块,用于统计所述识别模块识别到的循环中的第一指令和第二指令的指令数;
计算模块,用于根据所述统计模块统计得到的所述循环中的第一指令和第二指令的指令数、以及第一指令执行部件和第二指令执行部件的执行能力,计算循环展开次数和第一指令转换成第二指令的循环次数;
转换模块,用于在所述循环展开次数不等于1时,根据所述计算模块计算得到的循环展开次数对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令。
可选的,所述编译器还包括调度模块,用于对所述转换模块进行循环展开和指令转换得到的循环进行指令调度。
与现有技术相比,上述技术方案是通过编译器来实现的,具有以下优点:
1.通过循环展开和指令转换,处理器可以将不同的指令分配给不同的指令执行部件,因此,上述技术方案不需要用户参与就可以控制执行部件之间的负载平衡,充分利用了处理器中的指令执行部件的并行性,提高程序的执行效率,减轻用户的编程负担。
2.被循环展开的循环需要满足以下条件:在执行过程中具有确定的控制参数,不包含转移指令,以及循环中所有的第一指令不存在迭代间的相关性。这样可以保证第一指令转换成的第二指令和其它的第一指令不存在数据相关。因此,循环展开和指令转换后的第一指令和第二指令能够并行执行,进而达到较好的执行效率。
3.循环展开次数、第一指令转换成第二指令的循环次数是由第一指令执行部件的执行能力、第二指令执行部件的执行能力计算得到的,也就是比较精确考虑了部件之间的工作能力,因而在循环展开和指令转换后,处理器可以根据指令执行部件的执行能力的比例将不同的指令分配到不同的指令执行部件。
4.当第一指令执行部件和第二指令执行部件的执行能力有变化,由用户编写的程序就不能很好的适用,而上述技术方案具有较好的可移植性,只需要要修改优化过程中的相应参数,源程序不做改动,就可以适用新的处理器。
附图说明
图1是本发明实施例的编译方法的基本流程步骤;
图2是本发明实施例的编译方法的详细流程步骤;
图3是本发明实施例的编译器的结构图;
图4是一个4x32位的SIMD加法指令的操作实例。
具体实施方式
本发明实施例是在编译时,自动识别含SIMD扩展类型的循环程序,并对该循环程序进行处理,把其中的一部分SIMD指令转换成简单指令,将工作合理分配到简单指令执行部件和SIMD指令执行部件,从而充分利用简单指令执行部件和SIMD指令执行部件的并行性,提高程序的执行效率,并且无需用户参与。
下面即结合附图和实施例对本发明的具体实施方式做详细的说明。本发明实施例的编译方法的基本流程步骤如图1所示,所述编译方法包括:
步骤S11,识别包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性。
步骤S12,统计所述循环中第一指令和第二指令的指令数;
步骤S13,根据所述循环中的第一指令和第二指令的指令数、以及第一指令执行部件和第二指令执行部件的执行能力,计算循环展开次数和第一指令转换成第二指令的循环次数;
步骤S14,若所述循环展开次数不等于1,根据所述循环展开次数对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令。
所述第一指令是SIMD定点指令,第二指令是简单定点指令;或者,第一指令是SIMD浮点指令,第二指令是简单浮点指令。其中,定点指令是指指令的操作数的数据类型是整数类型,浮点指令是指指令的操作数的数据类型是浮点类型。下面是以第一指令是SIMD定点指令,第二指令是简单定点指令为例,结合图2对上述各步骤进行详细说明。
步骤S21,在对源程序进行编译的过程中,首先找到一个未处理的含SIMD定点指令的DOLOOP循环。所述DOLOOP循环是指在循环执行过程中,循环的控制参数不发生改变。所述DOLOOP循环还需要满足以下条件:不包含转移指令,以及循环中所有的SIMD定点指令不存在迭代间的相关性。满足上述条件的DOLOOP循环可以保证SIMD定点指令转换成的简单定点指令和其它的SIMD定点指令不存在数据相关。
本实施例中,SIMD定点指令是指定义了指令的操作数的数据类型为多整型数据操作的指令,例如:
intv4 va,vb,vc
vc=va+vb;
intv4定义了va、vb、vc为4x32位的整型数据,vc=va+vb就是一条SIMD定点指令,对4个32位的整型数据进行操作。
DOLOOP循环是指该循环在执行过程中有确定的控制参数(即上界、下界和步长),也就是说,在循环执行过程中,该循环的上界、下界和步长不发生改变,因此循环的执行次数即((下界-上界)/步长)也是确定的。例如:
do i=1,100,4
{......
......}
end do
该循环的上界为1,下界为100,步长为4。
又例如:
do i=a,b
{......
......}
end do
该循环的上界为a,下界为b,步长为1,若在程序执行到该循环时,a、b为确定的值,那么该循环也是DOLOOP循环。
转移指令是指会使循环在执行过程时跳出循环的指令,例如goto指令。
通常,1次循环又被称为1个迭代,迭代间的相关性是指本次循环的操作与上次循环的操作相关,例如:
intv4 va[100]
do i=1,100
va[i]=va[i-1]
end do
上述SIMD定点指令中,第i次循环中,计算va[i]的值时用到了上次循环计算得到的va[i-1]的值。
步骤S22,统计DOLOOP循环中SIMD定点指令和简单定点指令的指令数。在找到满足步骤S21所述条件的DOLOOP循环后,对该DOLOOP循环中SIMD定点指令和简单定点指令进行统计,得到该DOLOOP循环中简单定点指令的指令数为l,SIMD定点指令的指令数为m,若将所有m条SIMD定点指令都转换成简单定点指令,转换得到的简单定点指令的指令数为n。转换得到的简单定点的指令数n与SIMD定点指令的指令数m的关系与SIMD定点指令的类型和各类型的SIMD定点指令在程序中所占的比例有关,例如,1条intv4的SIMD加法指令可以转换成4条32位的简单加法指令,1条int128的SIMD逻辑指令可以转换成2条64位的简单逻辑指令。
步骤S23,根据所述DOLOOP循环中的SIMD定点指令和简单定点指令的指令数、以及SIMD定点指令执行部件和简单定点指令执行部件的执行能力,计算循环展开次数和SIMD定点指令转换成简单定点指令的循环次数。
对源程序进行编译后的目标程序由处理器分配给简单定点指令执行部件和SIMD定点指令执行部件,所述执行部件的执行能力是指每个时钟周期处理器可以发射给执行部件的指令数,执行能力可以由简单定点指令执行部件和SIMD定点指令执行部件的硬件设计实现。本实施例中,简单定点指令执行部件最多可以处理64位数据,SIMD定点指令执行部件最多可以处理128位数据。设定简单定点指令执行部件的执行能力为x,SIMD定点指令执行部件的执行能力为y。
循环展开是指按照循环展开次数,将循环部分展开或全部展开,以减少循环次数(或者说,迭代个数)。设定循环展开次数为unroll,其中包括trans个迭代需要把SIMD定点指令转换成简单定点指令(或者说,SIMD定点指令转换成简单定点指令的循环次数为trans),因此,不需要把SIMD定点指令转换成简单定点指令的迭代个数为(unroll-trans)。
当循环展开和指令转换后,简单定点指令的指令数为(unroll*l+trans*n),SIMD定点指令的指令数((unroll-trans)*m)。
步骤S23计算所得的循环展开次数unroll、SIMD定点指令转换成简单定点指令的循环次数trans,应使循环展开和指令转换后的简单定点指令的指令数(unroll*l+trans*n)与SIMD定点指令的指令数((unroll-trans)*m)的比值要尽量接近(约等于)简单定点指令执行部件的执行能力x与SIMD定点指令执行部件的执行能力y的比值。例如,执行下面的程序就可以得到循环展开次数unroll和SIMD定点指令转换成简单定点指令的循环次数trans:
unroll=1;
trans=0;
value=abs(l/m-x/y);
for(i=2;i<MAX_UNROLL;i++)
{
for(j=1;j<i;j++)
{
if(value>abs((i*l+j*n)/((i-j)*m)-x/y))
{
unroll=i;
trans=j;
value=abs((i*l+j*n)/((i-j)*m)-x/y);
}
}
}
上述程序中,DOLOOP循环中简单定点指令的指令数l,SIMD定点指令的指令数m,转换得到的简单定点指令的指令数n,简单定点指令执行部件的执行能力x,SIMD定点指令执行部件的执行能力y确定后,就可以得到循环展开次数unroll、SIMD定点指令转换成简单定点指令的循环次数trans。
因为循环展开次数、SIMD定点指令转换成简单定点指令的循环次数是由简单定点指令执行部件的执行能力、SIMD定点指令执行部件的执行能力计算得到的,也就是比较精确考虑了部件之间的工作能力,因而在循环展开和指令转换后,处理器可以合理地将简单定点指令、SIMD定点指令分配给简单定点指令执行部件、SIMD定点指令执行部件。
步骤S24,判断步骤S23计算所得的循环展开次数unroll是否等于1,若是,则返回至步骤S21,继续找下一个未处理的含SIMD定点指令的DOLOOP循环;若否,则继续执行步骤S25。
步骤S25,根据计算所得的循环展开次数unroll对DOLOOP循环进行循环展开,并根据计算所得的SIMD定点指令转换成简单定点指令的循环次数trans将所述循环展开中的SIMD定点指令转换成对应的简单定点指令。
举例来说,对于下面的程序:
intv4 va[100],vb[100],vc[100]
do i=1,100
vc[i]=va[i]+vb[i];
end do
循环中,简单定点指令的指令数l=0,SIMD定点指令的指令数m=1,将SIMD定点指令转换成简单定点指令,转换得到的简单定点指令的指令数为n=4。若步骤S23计算所得的循环展开次数unroll=5,那么循环展开为:
do i=1,100,5
vc[i]=va[i]+vb[i];
vc[i+1]=va[i+1]+vb[i+1];
vc[i+2]=va[i+2]+vb[i+2];
vc[i+3]=va[i+3]+vb[i+3];
vc[i+4]=va[i+4]+vb[i+4];
end do
在对循环进行循环展开后,再将循环展开后的程序中的部分SIMD定点指令转换成简单定点指令,若步骤S23计算所得的SIMD定点指令转换成简单定点指令的循环次数trans=2,那么就将循环展开后的前2次循环体的SIMD定点指令转换成对应的简单定点指令,例如:
do i=1,100,5
vc[i].s1=va[i].s1+vb[i].s1;
vc[i].s2=va[i].s2+vb[i].s2;
vc[i].s3=va[i].s3+vb[i].s3;
vc[i].s4=va[i].s4+vb[i]s4;
vc[i+1].s1=va[i+1].s1+vb[i+1].s1;
vc[i+1].s2=va[i+1].s2+vb[i+1].s2;
vc[i+1].s3=va[i+1].s3+vb[i+1].s3;
vc[i+1].s4=va[i+1].s4+vb[i+1].s4;
vc[i+2]=va[i+2]+vb[i+2];
vc[i+3]=va[i+3]+vb[i+3];
vc[i+4]=va[i+4]+vb[i+4];
end do
其中,vc[i].s1表示vc[i]中的第1个32位数据,依次类推,vc[i]s2表示vc[i]中的第2个32位数据,vc[i].s3表示vc[i]中的第3个32位数据,vc[i].s4表示vc[i]中的第4个32位数据。因此,循环展开和指令转换后,简单定点指令的指令数(unroll*l+trans*n)=8,SIMD定点指令的指令数((unroll-trans)*m)=3。
需要说明的是,本实施例为使实施起来更为方便,是将循环展开后的前2次循环体中的SIMD定点指令转换成对应的简单定点指令,实际上,将循环展开后的最后2次循环体或者任意2次循环体的SIMD定点指令转换成对应的简单定点指令也是可以的。
本实施例中,为了充分利用处理器资源,还包括步骤S26,对步骤S25的循环展开和指令转换后的循环进行指令调度。由于循环展开和指令转换后,循环的指令顺序可能会是多条SIMD定点指令排列在多条简单定点指令后,这样处理器在分配指令时会根据指令顺序先将简单定点指令发射给简单定点指令执行部件,再将SIMD定点指令发射给SIMD定点指令执行部件,也就是不能并行发射和执行简单定点指令和SIMD定点指令。指令调度就是按照数据相关、控制相关和结构相关等约束条件,重排指令顺序,将简单定点指令和SIMD定点指令间隔开,以此提高处理器的资源利用率和指令并行度。指令调度有多种为本领域技术人员所熟知的方法,并且也不是本发明的重点,在此即不展开说明。
另外,还需要说明的是,本实施例的处理器包括简单定点指令执行部件和SIMD定点指令执行部件,因此是以简单定点指令和SIMD定点指令为例进行说明的。如果处理器还包括简单浮点指令执行部件,并扩展了SIMD浮点指令执行部件,上述编译方法同样也是适用的。
对应上述编译方法,本实施例还提供一种编译器,用于将高级语言源程序翻译成目标机器可以执行的目标程序。所述目标机器的处理器包含有简单指令执行部件和SIMD指令执行部件。简单指令执行部件可以是简单定点指令执行部件,或者是简单浮点指令执行部件,或者是包括简单定点指令执行部件和简单浮点指令执行部件;SIMD指令执行部件可以是SIMD定点指令执行部件,或者是SIMD浮点指令执行部件,或者是包括SIMD定点指令执行部件和SIMD浮点指令执行部件。
如图3所示,所述编译器包括:识别模块31、统计模块32、计算模块33、转换模块34和调度模块35。
识别模块31,用于识别包含SIMD指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性。
统计模块32,用于统计所述识别模块31识别到的循环中的SIMD指令和简单指令的指令数。
计算模块33,用于根据所述统计模块32统计得到的所述循环中的SIMD指令和简单指令的指令数、以及SIMD指令执行部件和简单指令执行部件的执行能力,计算循环展开次数和SIMD指令转换成简单指令的循环次数。
转换模块34,用于在所述循环展开次数不等于1时,根据所述计算模块33计算得到的循环展开次数对所述循环进行循环展开,并根据所述SIMD指令转换成简单指令的循环次数将所述循环展开中的SIMD指令转换成对应的简单指令。
调度模块35,用于对所述转换模块34进行循环展开和指令转换得到的循环进行指令调度。
综上所述,上述技术方案是一种针对包含单指令多数据扩展指令执行部件的处理器的编译方法和编译器,实现了对包含有SIMD指令的程序的编译优化,其具有以下优点:
1.通过循环展开和指令转换,将循环中一部分SIMD指令转换成简单指令,处理器可以合理地将简单指令、SIMD指令分配给简单指令执行部件、SIMD指令执行部件,因此,上述技术方案可以控制执行部件之间的负载平衡,充分利用了处理器中的指令执行部件的并行性,提高程序的执行效率,减轻用户的编程负担。
2.被循环展开的循环需要满足以下条件:在执行过程中具有确定的控制参数,不包含转移指令,以及循环中所有的SIMD指令不存在迭代间的相关性。这样可以保证ESIMD指令转换成的简单指令和其它的SIMD指令不存在数据相关。因此,循环展开和指令转换后的简单指令和SIMD指令能够并行执行,进而达到较好的执行效率。
3.循环展开次数、SIMD指令转换成简单指令的循环次数是由简单指令执行部件的执行能力、SIMD指令执行部件的执行能力计算得到的,也就是比较精确考虑了部件之间的工作能力,因而在循环展开和指令转换后,处理器可以根据指令执行部件的执行能力的比例将简单指令、SIMD指令分配给简单指令执行部件、SIMD指令执行部件。
4.当简单指令执行部件和SIMD指令执行部件的执行能力有变化,由用户手工优化的程序就不能很好的适用,而上述技术方案具有较好的可移植性,只需要要修改优化过程中的相应参数,源程序不做改动,就可以适用新的处理器。
本发明虽然以较佳实施例公开如上,但其并不是用来限定本发明,任何本领域技术人员在不脱离本发明的精神和范围内,都可以做出可能的变动和修改,因此本发明的保护范围应当以本发明权利要求所界定的范围为准。
Claims (15)
1.一种编译方法,其特征在于,包括下述步骤:
识别包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性,所述第一指令是指单指令多数据扩展指令;
统计所述循环中第一指令和第二指令的指令数,所述第二指令是指与所述第一指令对应的简单指令;
根据所述循环中的第一指令和第二指令的指令数、以及第一指令执行部件和第二指令执行部件的执行能力,计算循环展开次数和第一指令转换成第二指令的循环次数;
若所述循环展开次数不等于1,根据所述循环展开次数对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令;
所述循环展开次数、第一指令转换成第二指令的循环次数根据下面的条件计算:
循环展开和指令转换后的第一指令的指令数与第二指令的指令数的比值约等于第一指令执行部件的执行能力与第二指令执行部件的执行能力的比值,其中,
所述循环展开和指令转换后的第二指令的指令数为(unroll*l+trans*n),第一指令的指令数为((unroll-trans)*m),其中,unroll为循环展开次数,trans为第一指令转换成第二指令的循环次数,l为所述循环中第二指令的指令数,m为所述循环中第一指令的指令数,n为将m条第一指令转换得到的第二指令的指令数;
所述执行能力是指每个时钟周期处理器发射给所述执行部件的指令数。
2.根据权利要求1所述的编译方法,其特征在于,所述第一指令是单指令多数据定点指令,第二指令是简单定点指令。
3.根据权利要求1所述的编译方法,其特征在于,所述第一指令是单指令多数据浮点指令,第二指令是简单浮点指令。
4.根据权利要求1所述的编译方法,其特征在于,所述循环的控制参数包括上界、下界和步长。
5.根据权利要求1所述的编译方法,其特征在于,根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令是指将所述循环展开中的前trans次循环体的第一指令转换成对应的第二指令。
6.根据权利要求1所述的编译方法,其特征在于,根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令是指将所述循环展开中的后trans次循环体的第一指令转换成对应的第二指令。
7.根据权利要求1所述的编译方法,其特征在于,还包括对所述循环展开和指令转换后的循环进行指令调度。
8.一种编译方法,其特征在于,包括下述步骤:
查找到一个未处理的包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性,所述第一指令是指单指令多数据扩展指令;
统计所述循环中第一指令和第二指令的指令数,所述第二指令是指与所述第一指令对应的简单指令;
根据所述循环中的第一指令和第二指令的指令数、以及第一指令执行部件和第二指令执行部件的执行能力,计算循环展开次数和第一指令转换成第二指令的循环次数;
若所述循环展开次数不等于1,根据所述循环展开次数对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令;
若所述循环展开次数等于1,继续查找下一个未处理的包含第一指令的循环,重复上述步骤;
所述循环展开次数、第一指令转换成第二指令的循环次数根据下面的条件计算:
循环展开和指令转换后的第一指令的指令数与第二指令的指令数的比值约等于第一指令执行部件的执行能力与第二指令执行部件的执行能力的比值,其中,
所述循环展开和指令转换后的第二指令的指令数为(unroll*l+trans*n),第一指令的指令数为((unroll-trans)*m),其中,unroll为循环展开次数,trans为第一指令转换成第二指令的循环次数,l为所述循环中第二指令的指令数,m为所述循环中第一指令的指令数,n为将m条第一指令转换得到的第二指令的指令数;
所述执行能力是指每个时钟周期处理器发射给所述执行部件的指令数。
9.一种编译器,其特征在于,包括:
识别模块,用于识别包含第一指令的循环,所述循环在执行过程中有确定的控制参数,所述循环不包含转移指令,且循环中所有的第一指令不存在迭代间的相关性,所述第一指令是指单指令多数据扩展指令;
统计模块,用于统计所述识别模块识别到的循环中的第一指令和第二指令的指令数,所述第二指令是指与所述第一指令对应的简单指令;
计算模块,用于根据所述统计模块统计得到的所述循环中的第一指令和第二指令的指令数、以及第一指令执行部件和第二指令执行部件的执行能力,计算循环展开次数和第一指令转换成第二指令的循环次数;
转换模块,用于在所述循环展开次数不等于1时,根据所述计算模块计算得到的循环展开次数对所述循环进行循环展开,并根据所述第一指令转换成第二指令的循环次数将所述循环展开中的第一指令转换成对应的第二指令;
所述计算模块根据下面的条件计算循环展开次数、第一指令转换成第二指令的循环次数:
循环展开和指令转换后的第一指令的指令数与第二指令的指令数的比值约等于第一指令执行部件的执行能力与第二指令执行部件的执行能力的比值,其中,
所述循环展开和指令转换后的第二指令的指令数为(unroll*l+trans*n),第一指令的指令数为((unroll-trans)*m),其中,unroll为循环展开次数,trans为第一指令转换成第二指令的循环次数,l为所述循环中第二指令的指令数,m为所述循环中第一指令的指令数,n为将m条第一指令转换得到的第二指令的指令数;
所述执行能力是指每个时钟周期处理器发射给所述执行部件的指令数。
10.根据权利要求9所述的编译器,其特征在于,所述第一指令是单指令多数据定点指令,第二指令是简单定点指令。
11.根据权利要求9所述的编译器,其特征在于,所述第一指令是单指令多数据浮点指令,第二指令是简单浮点指令。
12.根据权利要求9所述的编译器,其特征在于,所述循环的控制参数包括上界、下界和步长。
13.根据权利要求9所述的编译器,其特征在于,所述转换模块将所述循环展开中的第一指令转换成对应的第二指令是指将所述循环展开中的前trans次循环体的第一指令转换成对应的第二指令。
14.根据权利要求9所述的编译器,其特征在于,所述转换模块将所述循环展开中的第一指令转换成对应的第二指令是指将所述循环展开中的后trans次循环体的第一指令转换成对应的第二指令。
15.根据权利要求9所述的编译器,其特征在于,还包括调度模块,用于对所述转换模块进行循环展开和指令转换得到的循环进行指令调度。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200710094327 CN101452394B (zh) | 2007-11-28 | 2007-11-28 | 编译方法和编译器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200710094327 CN101452394B (zh) | 2007-11-28 | 2007-11-28 | 编译方法和编译器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101452394A CN101452394A (zh) | 2009-06-10 |
CN101452394B true CN101452394B (zh) | 2012-05-23 |
Family
ID=40734642
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200710094327 Expired - Fee Related CN101452394B (zh) | 2007-11-28 | 2007-11-28 | 编译方法和编译器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101452394B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101697135B (zh) * | 2009-10-28 | 2012-06-27 | 东方网力科技股份有限公司 | 一种编译程序的方法及装置 |
US9390539B2 (en) * | 2009-11-04 | 2016-07-12 | Intel Corporation | Performing parallel shading operations |
CN102455897B (zh) * | 2010-10-27 | 2013-11-27 | 无锡江南计算技术研究所 | 基于实例的迭代编译方法及编译装置 |
CN102360306A (zh) * | 2011-10-19 | 2012-02-22 | 上海交通大学 | 高级语言代码中循环数据流图提取优化信息处理方法 |
CN109032665B (zh) * | 2017-06-09 | 2021-01-26 | 龙芯中科技术股份有限公司 | 微处理器中指令输出处理方法及装置 |
JP7263994B2 (ja) * | 2019-09-17 | 2023-04-25 | 富士通株式会社 | 情報処理方法及び最適化プログラム |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6113650A (en) * | 1997-02-14 | 2000-09-05 | Nec Corporation | Compiler for optimization in generating instruction sequence and compiling method |
CN101021778A (zh) * | 2007-03-19 | 2007-08-22 | 中国人民解放军国防科学技术大学 | 超长指令字与单指令流多数据流融合的计算群结构 |
-
2007
- 2007-11-28 CN CN 200710094327 patent/CN101452394B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6113650A (en) * | 1997-02-14 | 2000-09-05 | Nec Corporation | Compiler for optimization in generating instruction sequence and compiling method |
CN101021778A (zh) * | 2007-03-19 | 2007-08-22 | 中国人民解放军国防科学技术大学 | 超长指令字与单指令流多数据流融合的计算群结构 |
Non-Patent Citations (1)
Title |
---|
朱嘉华.SIMD编译优化方法研究.《中国博士学位论文全文数据库》.2005, * |
Also Published As
Publication number | Publication date |
---|---|
CN101452394A (zh) | 2009-06-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101452394B (zh) | 编译方法和编译器 | |
Burger et al. | Scaling to the end of silicon with EDGE architectures | |
Kailas et al. | CARS: A new code generation framework for clustered ILP processors | |
Song et al. | Dynamic task scheduling for linear algebra algorithms on distributed-memory multicore systems | |
US8935515B2 (en) | Method and apparatus for vector execution on a scalar machine | |
JP4231516B2 (ja) | 実行コードの生成方法及びプログラム | |
Tirumalai et al. | Parallelization of loops with exits on pipelined architectures | |
Gross et al. | Compilation for a high-performance systolic array | |
Nguyen et al. | Bamboo--Translating MPI applications to a latency-tolerant, data-driven form | |
Nagarajan et al. | Static placement, dynamic issue (SPDI) scheduling for EDGE architectures | |
US20020083423A1 (en) | List scheduling algorithm for a cycle-driven instruction scheduler | |
Sánchez et al. | The effectiveness of loop unrolling for modulo scheduling in clustered VLIW architectures | |
Araujo et al. | Challenges in code generation for embedded processors | |
Larsen et al. | Exploiting vector parallelism in software pipelined loops | |
Nadeem et al. | JOP-plus-A processor for efficient execution of java programs extended with GALS concurrency | |
Petkov et al. | Efficient pipelining of nested loops: unroll-and-squash | |
US7774766B2 (en) | Method and system for performing reassociation in software loops | |
CN1306401C (zh) | 一种支持有向有环图的微调度方法 | |
Valluri et al. | Evaluating register allocation and instruction scheduling techniques in out-of-order issue processors | |
Hampton et al. | Compiling for vector-thread architectures | |
Hansen et al. | Multi-token resource sharing for pipelined asynchronous systems | |
Radhakrishnan et al. | Customization of application specific heterogeneous multi-pipeline processors | |
Chung et al. | A dualthreaded Java processor for Java multithreading | |
Franke | C compilers and code optimization for DSPs | |
Kale | Programming languages for CSE: The state of the art |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120523 Termination date: 20131128 |