买专利卖专利找龙图腾,真高效! 查专利查商标用IPTOP,全免费!专利年费监控用IP管家,真方便!
申请/专利权人:中国科学院上海高等研究院
摘要:本发明提供一种基于重排指令融合的编译自动向量化方法,包括:初始化一向量数据流;收集一个基本块中的Store指令,并按照访问的数据类型以及地址连续性来分组,形成若干个Store指令组;以所有Store指令组作为种子指令组加入同一个向量数据流,对Store指令组赋予索引;以构造的向量数据流为起点,构造所有可行的向量数据流,并从中选择最优的向量数据流;判断最优的向量数据流的代价如果大于0,则放弃向量化;否则,进行向量化变换。本发明的方法将基本块内所有种子指令组纳入同一向量数据流,可以一次向量化一个基本块并且可以发现不同种子指令组间的并性行,为程序生成具有更高向量化因子的程序,进一步提升程序的吞吐量。
主权项:1.一种基于重排指令融合的编译自动向量化方法,其特征在于,包括:步骤S1:初始化一向量数据流,所述向量数据流用于记录指令组、指令组的索引和指令组间的依赖关系;步骤S2:收集一个基本块中的Store指令,并按照访问的数据类型以及地址连续性来分组,最终形成若干个Store指令组,每一个Store指令组的所有Store指令访问一段连续地址空间且访问的数据宽度相同;以所有Store指令组作为种子指令组加入同一个向量数据流,同时,对每一个Store指令组赋予索引;步骤S3:以步骤S2构造的带有种子指令组的向量数据流为起点,构造所有可行的向量数据流,并从中选择最优的向量数据流;步骤S4:判断步骤S3得到的判断最优的向量数据流的代价是否大于0,如果大于0,则放弃向量化;否则,根据最优的向量数据流进行实质的程序的向量化变换;所述步骤S2包括:步骤S21:通过Store指令收集模块寻找基本块中的Store指令;步骤S22:检查这些Store指令各自访问的地址之间的依赖关系,将访问的地址之间没有依赖关系的多个Store指令作为能够并行执行的Store指令来分为一组,得到多组经过初次分组的Store指令;对于上述的每一组经过初次分组的Store指令,根据Store指令访问的地址的连续性进行进一步的排序分组,得到多个Store指令组;步骤S23:以所有的Store指令组均作为种子指令组加入同一个向量数据流,同时,对于每一个Store指令组,按照访问的地址从小到大排列的方式赋予索引,以使得其中的所有Store指令各自具有不同的索引值;其中,索引是指令组内指令的排布关系,是对指令组内每一指令赋予的唯一编号;在所述步骤S3中,进行向量数据流的构造,包括:步骤S31:将所有种子指令组加入向量数据流后得到的向量数据流作为初始的向量数据流,将初始的向量数据流作为本级递归的向量数据流并将当前的本级递归作为第0级递归;步骤S32:将本级递归的最优返回向量数据流和本级递归的候选指令组集合均设置为无效值;步骤S33:根据本级递归的向量数据流构造本级递归的候选指令组的集合;步骤S34:判断本级递归的候选指令组的集合是否为空;若本级递归的候选指令组的集合判断为空,以本级递归的向量数据流作为最下级递归时的本级递归的最优返回向量数据流,随后执行步骤S36;否则,备份本级递归的向量数据流、候选指令组的集合和最优返回向量数据流,随后,执行步骤S35;步骤S35:从本级递归的候选指令组的集合中选取一尚未被取过的候选指令组,将该候选指令组加入本级递归的向量数据流,以使得本级递归的向量数据流的递归等级加一;随后转入步骤S32;步骤S36:从备份还原出本级递归的向量数据流所在的上一级递归的所对应的向量数据流、候选指令组的集合和最优返回向量数据流,并将本级递归的最优返回向量数据流递归作为返回值返回给其上一级递归;步骤S37:将所述步骤S36中的上一级递归作为新的本级递归,计算步骤S36的返回值的索引和代价,将其与本级递归的最优返回向量数据流的代价相比较,根据比较结果更新本级递归的最优返回向量数据流;步骤S38:确定本级递归的向量数据流是否其所有候选指令组的选取分支均计算完毕,若尚未计算完毕,则回到所述步骤S35;否则,回到步骤S36以进一步返回至上一级递归,直到不存在上一级递归,输出此时的本级递归的最优返回向量数据流及其代价作为最优的向量数据流及其代价;在所述步骤S37中,本级递归的向量数据流的索引和代价是通过增量计算向量数据流的索引和代价的增量结果来计算的;先计算索引的增量结果,再计算代价的增量结果;所述增量计算是指计算步骤S35所选取的候选指令组的索引和代价,并将其与本级递归的向量数据流所在的选取分支尚未计算完毕的那一级递归的向量数据流之后所有后续加入的候选指令组和所有重排指令的索引和代价相加,作为本级递归的向量数据流的索引和代价的增量结果;且如果本级递归的最优返回向量数据流为无效值或者本级递归的最优返回向量数据流的代价高于返回值的代价,则将本级递归的最优返回向量数据流更新为返回值;否则,本级递归的最优返回向量数据流保持不变;步骤S35所选取的候选指令组的索引的计算步骤如下:步骤S371:将加入的候选指令组作为当前指令组,确定当前指令组是否是Load指令组,如果是,则对其赋予索引;步骤S372:确定当前指令组与本级递归的向量数据流的其他指令组之间的依赖关系,以确定当前指令组所依赖的各个指令组;如果当前指令组所依赖的某个指令组的大小与当前指令组的大小不符,则在这二者之间插入一条重排指令;如果当前指令组与存在依赖关系的某一指令组大小相同,且相关的指令组已经设置了索引,则将当前指令组的索引以相关的指令组的索引为基础来导出;步骤S373:判断此时当前指令组是否设置索引,如果此时当前指令组没有设置索引,则给当前指令组赋予任意索引;最优的向量数据流是指代价最小的向量数据流;向量数据流的代价是该向量数据流的所有指令组的相对代价和所有重排指令的代价的加和;向量数据流的一个指令组的相对代价是替代该指令组的一个SIMD指令的代价减去该指令组的每个指令的代价。
全文数据:
权利要求:
百度查询: 中国科学院上海高等研究院 一种基于重排指令融合的编译自动向量化方法
免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。