一种基于龙芯3A向量访存的编译优化方法技术

技术编号:6805432 阅读:327 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种基于龙芯3A向量访存的编译优化方法,特征是新增一条从向量树结构到中间表示的扩展路径,将向量形式的树结构转化为对应的中间表示;在扩展过程中,如果是正常模式,则沿着原有的路径进行扩展;如果是向量化的模式,则从新的路径进行扩展;对于含有公共运算变量的循环,将其生成的中间表示建立赋值链,更新赋值链上的操作数;在从树扩展到寄存器传输语言表示后,增加一个寄存器替换的优化遍;在编译器后端指令描述文件中,增加向量指令的后端指令描述,再由编译器自动将生成的中间表示转化为汇编指令。这样,编译器就可以自动生成高性能的向量访存指令,节约了程序员手写汇编的工作,并大幅提高了应用程序运行时的效率。

【技术实现步骤摘要】

本专利技术属于计算机编译
,具体涉及基于龙芯3A向量访存的编译优化及后端代码生成方法。
技术介绍
根据龙芯3A处理器的用户手册,现有龙芯3A处理器设计了向量访存指令,一次可以从内存中读取128位的数据,放在两个不同的寄存器中。在编译器中对向量访存的优化, 传统的方法是采用自动向量化的方法,但这需要硬件有向量寄存器的支持。由于现有龙芯 3A处理器中并没有设计向量寄存器,所以不能直接用自动向量化的方法来进行编译优化。龙芯处理器官方指定的编译器是开源编译器套装(GCC),可以利用GCC现有自动向量化的前端,生成向量形式的树结构,再扩展成向量形式的中间表示,进而生成向量访存指令。
技术实现思路
本专利技术提出一种基于龙芯3A向量访存的编译优化方法,以克服现有技术的上述缺陷,达到编译器自动生成龙芯3A特有向量访存指令的目的。本专利技术基于龙芯3A向量访存的编译优化方法,利用开源编译器套装(GCC)自动向量化的前端生成向量形式的树结构,进而扩展成对应的中间表示,再转化为向量指令;其特征在于先将向量形式的树结构转化为对应的中间表示,在该中间表示层次上进行循环语句中间表示层次上的多样性处理,再生成向量形式的汇编指令;具体操作步骤如下第一步、向量扩展在原有路径的基础上新增一条从向量树结构到中间表示的扩展路径;依次遍历树结构的各个节点,将向量形式的树结构扩展成龙芯3A向量指令对应的中间寄存器传输语言表示方式;在扩展过程中,如果是正常模式,则沿着原有的路径进行扩展;如果是向量化的模式,则从新的路径进行扩展;第二步、多样性处理对于含有公共运算变量的循环,将其生成的中间表示建立赋值链,更新赋值链上的操作数;在从树扩展到寄存器传输语言(RTL)表示后,即GCC中的扩展(expand)遍之后,增加一个寄存器替换(paSS_ri5place_reg)的优化遍,该优化遍的算法如下replace—reg—for—v2df(void) { F0R_ALL BB (bb) {S扫描每一个基本块*/ FOR—BB—INSNS(bb, insn) {/*扫描基本块中的每一条语句*/找到需要克隆的语句;/*公共运算变量被提取的语句*/ 克隆该语句,并将内存地址加8,赋值给新的寄存器; FOR BB INSNS (bb, insnparallel){/*公共运算变量是赋值语句的右值*/ if(该语句是要被修改的语句) 用新分配的寄存器替换原来的寄存器;FOR BB INSNS (bb, insnmult){/*公共运算变量是乘法语句的右值*/ if(该语句是要被修改的语句) 用新分配的寄存器替换原来的寄存器; replace—reg—Ι O; /*处理替换链上的寄存器*/FOR BB INSNS (bb, insnadd){/*公共运算变量是加法语句的右值*/ if(该语句是要被修改的语句) 用新分配的寄存器替换原来的寄存器; replace—reg—Ι O; /*处理替换链上的寄存器*/}}}第三步、向量访存指令的生成在GCC后端指令描述文件中,增加向量指令的后端指令描述,再由GCC自动将生成的中间表示转化为汇编指令。由于本专利技术设计了新的扩展路径,并对生成的中间表示进行多样性处理,然后将中间表示转化为对应的龙芯3A向量指令,克服了传统自动向量化方法需要依赖向量寄存器的缺点,从而使得编译器能够自动生成龙芯3A的向量指令,节省了大量手工写汇编指令的时间。并且本专利技术还利用了现有自动向量化的前端来生成向量形式的树结构,再扩展成向量形式的中间表示,进而生成向量访存指令,从而很好的利用了 GCC现有的编译器功能模块,节省了大量实现上的工作量。具体实施方式 实施例1本实施例基于龙芯3A向量访存的编译优化方法,初步的编译优化方案是先利用开源编译器套装(GCC)自动向量化的前端生成向量形式的树结构,再将该向量形式的树结构扩展成向量形式的中间表示;然后对向量形式的中间表示进行多样性处理;最后将向量形式的中间表示转化成向量访存指令。具体操作步骤如下第一步、向量扩展龙芯向量1 位访存的指令格式为gsLQCl fq, ft, offset (base) ;gsSDCl fq, ft, offset (base)。自动向量化生成向量形式的树结构,但是此时的树结构中访存和计算都是默认有1 位寄存器的,即原操作数和目标操作数都只有一个,为1 位模式。而龙芯向量访存的W的目的操作数和SD得原操作数都是两个操作数。所有在进行向量扩展的时候,需要进行转化,将1 为的操作数变成两个64位操作数,并且模拟向量运算。正常的向量扩展路径如下所示源程序段double a, b;for(i = 0 ;i < 20 ;i++)b = b+c向量形式树结构MEM = MEM + MEM ivtmp.71 = ivtmp.71 +16 if(ivtmp.71 != 160)goto <bb3> elsegoto <bb4>源程序段经过自动向量化后转化为向量形式树结构。表达式都是按照树结构深度优先转换树结点为RTL表示。龙芯3A没有设计1 位的向量寄存器,而是通过两个浮点寄存器完成1 位数据存放的任务。针对这种模式,本专利技术在原有龙芯3A向量扩展路径的基础上新增了一条从向量树结构到中间表示的扩展路径在扩展过程中,如果是正常模式,则沿着原有的路径进行扩展;如果是向量化的模式,则从新的路径进行扩展。经过这种处理后,向量化模式的表达式和非向量化的表达式扩展过程仍会共用部分函数接口,避免代码的冗余开销。第二步、多样性处理通过对大量应用程序的统计,发现多样性的特点表现为以下几个方面(1)语句在循环结构中,并且能自动向量化。(2)语句中,有公共的运算变量,如示例1的for循环结构中的C。示例 1 for(i = 0 ;i < N ;i++){A = B+C;E = D+C;}示例 2 for(i = 0 ;i < N ;i++){A = B+C;E = D+C;}(3)有公共运算变量的某条语句的左值可能是另外一个语句的右值,形成一条赋值链条。如示例2的for循环结构中的A。在具体的程序中,多样性主要体现在以下3类循环程序上多样性1:for(i=0; i<N; i++){ x = b; b = c; a = x;}多样性2 for(i=0; i<N; i++){a=b*c+d*b or x = b;a = a + x*x;}多样性3 for(i=0; i<N; i++){ a=b + c; d = e + c;fli] = g + a;}这三类程序分别代表的特性是(1)公共运算变量是赋值语句的右值,如多样性1中的χ变量。(2)公共运算变量是乘法语句的右值,如多样性2中的b或χ。(3)公共运算变量是加法语句的右值,如多样性3中的c。多样性1、2、3所示的程序向量化后树结构会出现如下所示的情形vect—var—.44 = MEM; MEM = vect—var—.44 * MEM + vect—var—.44 * MEM; ivtmp.71 = ivtmp.71 + 16; if (ivtmp.71 != 160) goto <bb 3>;本文档来自技高网...

【技术保护点】
1.一种基于龙芯3A向量访存的编译优化方法,利用编译器自动向量化的前端生成向量形式的树结构,进而扩展成对应的中间表示,再转化为向量指令;其特征在于:先将向量形式的树结构转化为对应的中间表示,在该中间表示层次上进行循环语句中间表示层次上的多样性处理,再生成向量形式的汇编指令;具体操作步骤如下:第一步、向量扩展:在原有路径的基础上新增一条从向量树结构到中间表示的扩展路径;依次遍历树结构的各个节点,将向量形式的树结构扩展成龙芯3A向量指令对应的中间寄存器传输语言表示方式;在扩展过程中,如果是正常模式,则沿着原有的路径进行扩展;如果是向量化的模式,则从新的路径进行扩展;第二步、多样性处理:对于含有公共运算变量的循环,将其生成的中间表示建立赋值链,更新赋值链上的操作数;在从树扩展到寄存器传输语言表示后,即编译器中的扩展遍之后,增加一个寄存器替换的优化遍,该优化遍的算法如下:第三步、向量访存指令的生成:在编译器后端指令描述文件中,增加向量指令的后端指令描述,再由编译器自动将生成的中间表示转化为汇编指令。

【技术特征摘要】

【专利技术属性】
技术研发人员:顾乃杰彭飞林传文郭利财
申请(专利权)人:中国科学技术大学
类型:发明
国别省市:34

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1