1.一种函数的访存优化编译方法,其特征在于,包括:
编译器根据与待编译函数的函数序或函数跋相关的同一类型的寄存器的宽度和目标处理器中的向量访存指令的访存宽度,对所述同一类型的寄存器进行分组,获取至少一个寄存器分组;其中,每个所述寄存器分组中包括至少一个寄存器;
所述编译器根据每个所述寄存器分组中寄存器的个数确定每个所述寄存器分组对应的中间代码的类型;
若所述编译器确定所述寄存器分组对应的中间代码的类型为向量形式的中间代码,则所述编译器对所述寄存器分组生成一条向量形式的第一中间代码;
所述编译器根据所述第一中间代码生成第一汇编代码,并将所述第一汇编代码输出给所述目标处理器。
2.根据权利要求1所述的方法,其特征在于,所述编译器根据每个所述寄存器分组中寄存器的个数确定每个所述寄存器分组对应的中间代码的类型,具体包括:
所述编译器根据所述寄存器分组中的寄存器的个数、所述向量访存指令的访存宽度和所述同一类型的寄存器的宽度,确定每个所述寄存器分组对应的中间代码的类型。
3.根据权利要求2所述的方法,其特征在于,所述编译器根据所述寄存器分组中的寄存器的个数、所述向量访存指令的访存宽度、所述同一类型的寄存器的宽度,确定每个所述寄存器分组对应的中间代码的类型,具体包括:
所述编译器判断所述寄存器分组中的寄存器的个数是否等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值;
若是,则所述编译器确定所述寄存器分组对应的中间代码的类型为向量形式的中间代码;
若否,则所述编译器根据所述寄存器分组的个数和所述向量访存指令的向下兼容结果,确定所述寄存器分组对应的中间代码的类型为标量形式的中间代码,或,向量形式的中间代码。
4.根据权利要求1-3任一项所述的方法,其特征在于,所述编译器对所 述寄存器分组生成一条向量形式的第一中间代码之后,所述方法还包括:
所述编译器为所述第一中间代码附加第一调试信息;所述第一调试信息用于指示所述寄存器分组中的寄存器被保存在栈中的位置。
5.根据权利要求4所述的方法,其特征在于,所述编译器根据所述第一中间代码生成第一汇编代码,并将所述第一汇编代码输出给所述目标处理器,具体包括:
所述编译器根据所述第一调试信息生成第一调试伪指令;
所述编译器将所述第一调试伪指令和所述第一汇编代码输出给所述目标处理器。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
若所述编译器确定所述寄存器分组对应的中间代码的类型为标量形式的中间代码,则所述编译器对所述寄存器分组中的每个寄存器分别生成一条标量形式的第二中间代码;
所述编译器为所述第二中间代码附加第二调试信息;所述第二调试信息用于指示所述寄存器分组中的寄存器被保存在栈中的位置;
所述编译器根据所述第二中间代码生成第二汇编代码;
所述编译器根据所述第二调试信息生成第二调试伪指令;
所述编译器将所述第二调试伪指令和所述第二汇编代码输出给所述目标处理器。
7.根据权利要求4-6任一项所述的方法,其特征在于,所述待编译函数涉及的同一类型的寄存器的总个数为N,所述N为大于等于2的正整数;则所述编译器根据与所述函数的函数序或函数跋相关的同一类型的寄存器的宽度和所目标处理器中的向量访存指令的访存宽度,对所述同一类型的寄存器进行分组,获取寄存器分组,具体包括:
所述编译器对所述同一类型的寄存器按照从小到大的顺序进行编号;
所述编译器判断所述同一类型的寄存器中的每个寄存器在所述栈中的保存地址相对于栈基址寄存器sp的第一偏移是否均为M字节对齐,获得第一判断结果;其中,所述M为所述向量访存指令的访存宽度;
所述编译器根据所述第一判断结果对所述同一类型的寄存器进行分组,获取所述寄存器分组。
8.根据权利要求7所述的方法,其特征在于,所述编译器根据所述第一判断结果对所述同一类型的寄存器进行分组,获取所述寄存器分组,包括:
若所述第一判断结果为每个所述第一偏移均是M字节对齐,则所述编译器根据所述N、所述向量访存指令的访存宽度和所述同一类型的寄存器的宽度对所述同一类型的寄存器进行分组,获取所述寄存器分组。
9.根据权利要求8所述的方法,其特征在于,所述编译器根据所述N、所述向量访存指令的访存宽度和所述同一类型的寄存器的宽度对所述同一类型的寄存器进行分组,获取所述寄存器分组,具体包括:
若所述第一判断结果为每个所述第一偏移均是M字节对齐,则所述编译器继续判断所述N是否可以整除所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值;
若整除,则所述编译器对所述N个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组;其中,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值,所述第一寄存器分组中的寄存器为顺序编号的寄存器;
若不能整除,则所述编译器对前(N-P)个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组,并根据后P个顺序编号的寄存器确定第二寄存器分组;其中,所述P为所述N除以所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值的余数,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值。
10.根据权利要求7所述的方法,其特征在于,所述编译器根据所述第一判断结果对所述同一类型的寄存器进行分组,获取所述寄存器分组,还包括:
若所述第一判断结果为至少一个所述第一偏移是M字节不对齐,则所述编译器确定不对齐的寄存器的个数,并根据所述N、所述不对齐的寄存器的个数、所述向量访存指令的访存宽度和所述同一类型的寄存器的宽度,对所述同一类型的寄存器进行分组,获取所述寄存器分组。
11.根据权利要求10所述的方法,其特征在于,所述编译器根据所述N、所述不对齐的寄存器的个数、所述向量访存指令的访存宽度和所述同一类型 的寄存器的宽度,对所述同一类型的寄存器进行分组,获取所述寄存器分组,具体包括:
若所述第一判断结果为至少一个所述第一偏移是M字节不对齐,则所述编译器确定第二偏移为所述第一个寄存器相对于所述栈基址寄存器sp的第一偏移加上不对齐的寄存器的个数T乘以所述不对齐的寄存器的宽度的乘积的和,并继续判断所述N减去所述T的差值是否可以整除所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值;
若整除,则所述编译器对后(N-T)个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组,并根据前T个顺序编号的寄存器确定第二寄存器分组;其中,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值,所述第一寄存器分组中的寄存器为顺序编号的寄存器;
若不整除,则所述编译器对后(N-T)个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组,并根据前T个顺序编号的寄存器确定第二寄存器分组,并根据后Q个顺序编号的寄存器确定第三寄存器分组;其中,所述Q为所述(N-T)的差值除以所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值的余数,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值。
12.一种函数的访存优化编译装置,其特征在于,包括:
分组模块,用于根据与待编译函数的函数序或函数跋相关的同一类型的寄存器的宽度和目标处理器中的向量访存指令的访存宽度,对所述同一类型的寄存器进行分组,获取至少一个寄存器分组;其中,每个所述寄存器分组中包括至少一个寄存器;
确定模块,用于根据所述分组模块获得的每个所述寄存器分组中寄存器的个数确定每个所述寄存器分组对应的中间代码的类型;
第一生成模块,用于在所述确定模块确定所述寄存器分组对应的中间代码的类型为向量形式的中间代码,则对所述寄存器分组生成一条向量形式的第一中间代码;
第二生成模块,用于根据所述第一生成模块生成的所述第一中间代码生成第一汇编代码,并将所述第一汇编代码输出给所述目标处理器。
13.根据权利要求12所述的装置,其特征在于,所述确定模块,具体用于根据所述分组模块获得的所述寄存器分组中的寄存器的个数、所述向量访存指令的访存宽度和所述同一类型的寄存器的宽度,确定每个所述寄存器分组对应的中间代码的类型。
14.根据权利要求13所述的装置,其特征在于,所述确定模块,具体用于判断所述分组模块获得的所述寄存器分组中的寄存器的个数是否等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值,若是,则确定所述寄存器分组对应的中间代码的类型为向量形式的中间代码;若否,则根据所述寄存器分组的个数和所述向量访存指令的向下兼容结果,确定所述寄存器分组对应的中间代码的类型为标量形式的中间代码,或,向量形式的中间代码 。
15.根据权利要求12-14任一项所述的装置,其特征在于,所述装置还包括:
第一调试信息附加模块,用于在所述第一生成模块对所述寄存器分组生成一条向量形式的第一中间代码之后,为所述第一中间代码附加第一调试信息;所述第一调试信息用于指示所述寄存器分组中的寄存器被保存在栈中的位置。
16.根据权利要求15所述的装置,其特征在于,所述第二生成模块,具体用于根据所述第一调试信息生成第一调试伪指令,并将所述第一调试伪指令和所述第一汇编代码输出给所述目标处理器。
17.根据权利要求12所述的装置,其特征在于,所述装置还包括:第二调试信息附加模块;其中,
所述第一生成模块,还用于在所述确定模块确定所述寄存器分组对应的中间代码的类型为标量形式的中间代码时,对所述寄存器分组中的每个寄存器分别生成一条标量形式的第二中间代码;
所述第二调试信息附加模块,用于为所述第一生成模块生成的所述第二中间代码附加第二调试信息;所述第二调试信息用于指示所述寄存器分组中的寄存器被保存在栈中的位置;
所述第二生成模块,还用于根据所述第二中间代码生成第二汇编代码,并根据所述第二调试信息生成第二调试伪指令,并将所述第二调试伪指令和 所述第二汇编代码输出给所述目标处理器。
18.根据权利要求15-17任一项所述的装置,其特征在于,所述待编译函数涉及的同一类型的寄存器的总个数为N,所述N为大于等于2的正整数;则所述分组模块,具体包括:
排序单元,用于对所述同一类型的寄存器按照从小到大的顺序进行编号;
判断单元,用于判断所述同一类型的寄存器中的每个寄存器在所述栈中的保存地址相对于栈基址寄存器sp的第一偏移是否均为M字节对齐,获得第一判断结果;其中,所述M为所述向量访存指令的访存宽度;
分组单元,用于根据所述判断单元的所述第一判断结果对所述同一类型的寄存器进行分组,获取所述寄存器分组。
19.根据权利要求18所述的装置,其特征在于,所述分组单元,具体用于在所述判断单元的所述第一判断结果为每个所述第一偏移均是M字节对齐时,根据所述N、所述向量访存指令的访存宽度和所述同一类型的寄存器的宽度对所述同一类型的寄存器进行分组,获取所述寄存器分组。
20.根据权利要求19所述的装置,其特征在于,所述分组单元,具体用于在所述判断单元的所述第一判断结果为每个所述第一偏移均是M字节对齐时,指示所述判断单元继续判断所述N是否可以整除所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值;
若整除,则对所述N个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组;其中,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值,所述第一寄存器分组中的寄存器为顺序编号的寄存器;
若不能整除,则对前(N-P)个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组,并根据后P个顺序编号的寄存器确定第二寄存器分组;其中,所述P为所述N除以所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值的余数,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值。
21.根据权利要求18所述的装置,其特征在于,所述分组单元,还用于在所述判断单元的所述第一判断结果为至少一个所述第一偏移是M字节不对齐时,确定不对齐的寄存器的个数,并根据所述N、所述不对齐的寄存器的 个数、所述向量访存指令的访存宽度和所述同一类型的寄存器的宽度,对所述同一类型的寄存器进行分组,获取所述寄存器分组。
22.根据权利要求21所述的装置,其特征在于,所述分组单元,具体用于在所述判断单元的所述第一判断结果为至少一个所述第一偏移是M字节不对齐时,确定第二偏移为所述第一个寄存器相对于所述栈基址寄存器sp的第一偏移加上不对齐的寄存器的个数T乘以所述不对齐的寄存器的宽度的乘积的和,并继续指示所述判断单元判断所述N减去所述T的差值是否可以整除所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值;
若整除,则对后(N-T)个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组,并根据前T个顺序编号的寄存器确定第二寄存器分组;其中,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值,所述第一寄存器分组中的寄存器为顺序编号的寄存器;
若不整除,则对后(N-T)个顺序编号的寄存器进行分组,获得至少一个第一寄存器分组,并根据前T个顺序编号的寄存器确定第二寄存器分组,并根据后Q个顺序编号的寄存器确定第三寄存器分组;其中,所述Q为所述(N-T)的差值除以所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值的余数,所述第一寄存器分组中寄存器的个数等于所述向量访存指令的访存宽度除以所述同一类型的寄存器的宽度的商值。