ARM二进制代码的NEON向量化转换方法技术

技术编号:12705641 阅读:76 留言:0更新日期:2016-01-14 02:04
本发明专利技术公开一种ARM二进制代码的NEON向量化转换方法,包括以下步骤:第一步、反汇编;第二步、流图生成;第三步、循环检测;第四步、内存分析;第五步、指令翻译;第六步、汇编指令输出。本发明专利技术通过将ARM的二进制代码反汇编后建立控制流图和做到达定值分析,找到目标优化对象所在的基本块,并分析要优化的基本块中访存模式,同时跟据片上空闲的扩展寄存器和核心寄存器的资源调度,将部分重复访存结果存储在空闲的片上寄存器中,利用访问高速的寄存器来减少程序访存的时间开销,从而达到加速的目的。

【技术实现步骤摘要】
【专利说明】ARM二进制代码的NEON向量化转换方法
本专利技术属于嵌入式虚sn?自动并行化
,特别涉及一种ARM二进制代码的 NEON向量化转换方法,适用适用于图像处理、矩阵计算相关领域的底层函数加速。 【
技术介绍
】ARM处理器因为其高性能和低功耗,成为了最受欢迎的嵌入式应用处理器。随着用 户对ARM程序执行时间要求越来越苛刻,部分存在大量的数据计算的ARM程序需要进行加 速。在原ARM程序无法得到的情况下要实现对ARM程序的加速,可以利用SMID单元从二进 制代码层面着手加速。 目前利用sn?指令加速的算法中SLP算法较为完善,且根据相关文章中的测试结 果来看,SLP算法具有较好的加速效果,因此首先使用SLP算法对ARM二进制代码指令加速。 然而将SLP算法实现后经测试发现:SLP算法优化后的程序没有加速,甚至部分优 化结果耗时大于原程序耗时。原因有以下三点: 首先,原SLP算法没有减少循环次数。尽管SLP算法在局部有将几条计算指令合 并为一条NEON指令,然而和从循环量级上减少指令数量相比,SLP算法减少的总指令执行 次数非常少。 其次,也是最主要的一点,ARM程序中主要的耗时指令是访存指令(STR/LDR,这里 不考虑特殊的ARM指令),SLP算法并没有大量减少访存指令的数量或大量优化访存模式。 在ARM程序中,一般性的计算指令如ADD、SUB、LSL、MUL等指令,实际耗时远小于一次访问 内存的时间。而且SLP算法由于主要是以ARM指令为基础,优化少量的计算语句为NEON指 令,因此尽管减少了部分计算指令的数量,但是增加了NEON的q寄存器和ARM的R寄存器 之间的数据搬移指令,从结果上看,没有减少指令的总体数量,甚至一般情况下都是会增加 整体指令的数量。 最后,SLP优化结果存在大量的q寄存器和r寄存器之间的数值交换,减少了流水 线的利用程度,增加了程序运行的时间。 【
技术实现思路
】 本专利技术的目的在于提供一种ARM二进制代码的NEON向量化转换方法,利用ARM上 SIMD架构和相应的NEON语言,对程序进行自动并行加速。由于NEON语言功能的局限性 和S頂D单元对处理数据要求的局限性,NEON指令对内存的读取方式要求较为严格,因此需 要对二进制代码进行一定的分析判断才能决定二进制代码是否可以利用NEON指令进行加 速。为了能实现上述功能,本专利技术将优化目标选为嵌套最深的循环,嵌套最深的循环往往结 构较为简单且耗时巨大而且利用循环的特征利于分析访存模式,因此本专利技术就是利用NEON 指令针对嵌套循环指令进行优化,从而实现对程序加速的目标。 为了实现上述目的,本专利技术采用如下技术方案: ARM二进制代码的NEON向量化转换方法,包括以下步骤: 第一步、反汇编:对ARM程序的二进制代码文件进行反汇编,得到每条二进制代码 对应的原ARM指令信息; 第二步、流图生成:在ARM指令反汇编的基础上建立基本块的控制流图,在已有控 制流图的基础上,对各个基本块进行到达定值分析; 第三步、循环检测:通过循环检测寻找嵌套层数最多的循环,并将其最内层循环的 组成基本块进行标记; 第四步、内存分析:寻找优化目标中需要成组翻译的ARM指令,将其标记,标记后 的指令将不进行内存优化;寻找指令中完成循环功能的指令,同样将其标记且不参与内存 优化; 在以上的标记基础上,寻找所有访存指令,并且将访问相同内存的访存指令进行 合并;合并后根据内存分析方案,标记每个访存指令的访存类型; 第五步、指令翻译:将循环指令、成组翻译的指令、访存指令及其地址偏移计算指 令、热计算指令、不随循环变化的指令进行翻译; 第六步、汇编指令输出:根据第五步的翻译结果进行汇编并输出。 进一步的,第三步具体包括以下步骤:将控制流图中每个基本块抽象为节点,基本 块间的跳转关系抽象为有向边,将控制流图抽象为有向图,在有向图中找所有的环,并判断 所有找到的环是否是为一条循环而不是简单的跳转语句组成的环;同时,将入口基本块和 出口基本块相同的循环进行合并;在合并后,判断循环间的嵌套关系,同时得到嵌套层数数 最多的循环,即最内层循环,并标记组成该循环的基本块是循环的哪一部分。 进一步的,第四步具体包括以下步骤: 在内存分析进行前,首先将目标优化ARM程序中实现循环的汇编指令进行标记; 而后再根据成组翻译指令的识别规则,寻找组合翻译的指令并将其标记; 在经过上述标记后,将实现循环的指令和需要组合翻译的指令排除在外,统计目 标优化程序中的所有访存指令;根据访存指令的自身携带的信息以及在访存指令前实现地 址偏移计算的指令的语义分析结果,对内存相同的访存指令进行合并;而后,对每个内存地 址进行访存模式分析,如果一个访存模式的步进形式满足以下三个条件中至少一个条件: (1)等间距步进(包括正向和负向)的访存模式。 (2)访问连续地址变化的内存地址。 (3) 2~4条指令组合在一起连续读取或者一起连续写内存。 那么就利用NEON的访存指令代替原ARM的访存指令;同时,进行特殊访存模式的 识别并标记其翻译模式。 进一步的,内存分析后将随着循环进行线性连续步进、等间距步进、奇数次访存这 三类地址设定为动态内存地址,而不随循环变化的地址定为静态地址; 根据动态和静态地址,将指令划分为以下几类: 动态指令: (1)访问动态地址的指令; (2)指令中所有数据都来自于动态地址的指令; 静态指令: (1)访问静态内存的指令; (2)所有数据为立即数或者来自于静态地址; 可变为动态的指令: (1)定义的寄存器的结果将会存储到静态地址; (2)指令中只有一个值来自于静态地址或者未定义的寄存器。 进一步的,第五步中,ARM和NEON指令在翻译时,利用ARM的核心寄存器编号和扩 展寄存器编号都为〇~15的特点,利用原ARM程序的编译结果,找寻NEON和ARM指令结构 对应相同且功能对应相同的指令进行直接翻译;对于扩展寄存器的高双字部分和低双字部 分进行翻译映射时,核心寄存器的〇~15分别和扩展寄存器的低双字部分进行映射翻译。 进一步的,空闲资源调度包括空闲q寄存器和空闲r寄存器调度; 空闲q寄存器调度过程: 首先将所有扩展寄存器标记为空闲可用; 第一遍,遍历当前目标优化基本块内的所有指令,如果当前指令同时满足: (1)不参与偏移地址计算的指令; (2)不是参与循环实现的指令; (3)且存在定义的寄存器; 这三个条件,那么和当前指令定义寄存器同名的扩展寄存器为非空闲并标记; 第二遍,遍历当前目标优化基本块内的所有指令,如果当前指令同时满足: (1)不是访存指令且当前指令; (2)不是某个访存指令的计算地址偏移的指令; (3)不是参与完成循环功能的指令; 这三个条件,那么当和前指令使用寄存器同名的扩展寄存器是非空闲的,并标记 为非空闲; 第三遍,遍历当前目标优化基本块内的所有指令,如果当前指令是不翻译的指令, 那么和当前指令使用的寄存器同名的扩展寄存器标记为空闲; 第四遍,遍历所有访存指令,如果访存指令是完成多条指令组合在一起形成vldn/ vstn的指令,那么和这些指令定义寄存器同名的扩展寄存器是空闲的; 空闲r寄存器调度过程: 首先将全部r寄存器标记为可用; 第一遍本文档来自技高网
...
ARM二进制代码的NEON向量化转换方法

【技术保护点】
ARM二进制代码的NEON向量化转换方法,其特征在于,包括以下步骤:第一步、反汇编:对ARM程序的二进制代码文件进行反汇编,得到每条二进制代码对应的原ARM指令信息;第二步、流图生成:在ARM指令反汇编的基础上建立基本块的控制流图,在已有控制流图的基础上,对各个基本块进行到达定值分析;第三步、循环检测:通过循环检测寻找嵌套层数最多的循环,并将其最内层循环的组成基本块进行标记;第四步、内存分析:寻找优化目标中需要成组翻译的ARM指令,将其标记,标记后的指令将不进行内存优化;寻找指令中完成循环功能的指令,同样将其标记且不参与内存优化;在以上的标记基础上,寻找所有访存指令,并且将访问相同内存的访存指令进行合并;合并后根据内存分析方案,标记每个访存指令的访存类型;第五步、指令翻译:将循环指令、成组翻译的指令、访存指令及其地址偏移计算指令、热计算指令、不随循环变化的指令进行翻译;第六步、汇编指令输出:根据第五步的翻译结果进行汇编并输出。

【技术特征摘要】

【专利技术属性】
技术研发人员:梅魁志温哲西李博良张少愚刘辉黄雄高榕付帅伍健
申请(专利权)人:西安交通大学
类型:发明
国别省市:陕西;61

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

1