一种优化的memset标准库函数汇编代码生成方法

文档序号:6385144阅读:566来源:国知局
专利名称:一种优化的memset标准库函数汇编代码生成方法
技术领域
本发明涉及标准库函数汇编代码生成技术,尤其涉及一种优化的memset标准库函数汇编代码生成方法。
背景技术
数字信号处理任务通常需要完成大量的数据计算,如数字信号处理中常用的 FIR (Finite Impulse Response,有限长单位冲激响应)滤波器和 FFT (Fast Fourier Transformation,快速傅氏变换)算法,而数组的初始化工作一般由C标准中的memset标准库函数完成。在Cll标准中,memset标准库函数定义为将某一特定大小的内存区域全部以特定单字节数据进行填充。由于内存的速度相对于微处理器来说要慢得多,而对于面向数据密集型应用的微处理器而言,用于数据初始化的memset标准库函数属调用密集型,对其进行优化很有意义。一般地,对于具有不同硬件特性的微处理器而言,标准库函数在高级语言层面上的实现是一致的。然而,正是因为这种一致性,高级语言层面上的标准库函数很难做到针对特定目标体系结构的彻底优化。从优化的时机出发,在汇编级对程序进行优化, 程序越底层,代码越容易调度,更能有效利用指令集。因此,现代微处理器为了提高处理性能,很多标准库函数都是以汇编的形式内嵌静态库中。
上述所提及的memset标准库函数所做的操作是把某一特定内存块全部以特定单字节数据进行填充,其典型实现是单字节数据填充。这种算法实现简单,当待填充的内存块规模较小时,性能尚可。然而,当微处理器的数据带宽大于8比特,且待填充的内存块规模较大时,这种单字节数据的填充方式远没有发挥微处理器的数据带宽,性能较低。在大多数平台下,从内存对齐边界处开始对其实现数据填充可以充分发挥微处理器的数据带宽。
现有技术中的GCC(GNU Compiler Collection)编译器在对memset标准库函数实现优化时正是利用了这一点,将待填充的内存块规模按照目标填充地址对齐与否分为三部分对齐边界之前的内存块、对齐填充的内存块,对齐边界之后的内存块。其中,目标地址对齐的内存块采用多字节数据传输指令一次性填充多字节数据,不对齐部分仍采用单字节数据传输指令完成填充。GCC编译器对于memset标准库函数的优化在C语言级别上实现了相同的代码,然而,在汇编级实现优化需要针对不同的体系结构,结合各自的硬件特性分别实现,可移植性较差。对于其他自主研发的微处理器,现有的对于标准库函数汇编级的优化, 大部分是根据目标处理器的硬件特性,在由相应编译器编译高级语言生成的汇编代码基础上,对其进行手工优化以获得当前微处理器上的较优性能。然而,这种对于标准库函数的优化方法,是基于编译器编译高级语言得到的汇编代码,冗余较多,优化不够彻底。发明内容
本发明的目的是基于标准库函数的行为本质,提供一种优化的memset标准库函数汇编代码的生成方法。
为实现上述目的,本发明提供了一种优化的memset标准库函数汇编代码生成方法,该方法包括根据目标机器的硬件特性,确定待生成的优化的填充执行片段所具有的属性特征及规模;根据上述待生成的优化的填充执行片段的规模,构造集中跳转表,该集中跳转表由多条分支跳转语句构成,每条分支跳转语句旨在将执行路径引向相应的优化的填充执行片段;根据上述集中跳转表,基于目标机器可用的逻辑运算指令,对输入参数中的目标填充地址和填充规模按照上述待生成的优化的填充执行片段的属性特征进行分支判断,建立输入参数集到集中跳转表的映射关系;根据目标机器可用的数据传输指令集、上述待生成的优化的填充执行片段所具有的属性特征,即特定的填充要求信息,生成满足填充要求的所有填充模式构成的填充模式集合;根据目标机器的硬件特性,对上述填充模式集合进行性能筛选,得到具有最优填充性能的填充模式,由此生成优化的填充执行片段。
本发明实施例基于标准库函数的行为本质,设计了一种优化的memset标准库函数汇编代码生成方法,该方法生成的memset标准库函数汇编代码在执行时,能够根据输入参数,即填充要求信息,实现具有针对性优化地数据填充,且只需通过修改硬件特性自定义文件,可扩展到其他基于RISC (Reduced Instruction Set Computer,精简指令集计算机)的体系结构上,可移植性较好。


通过以下结合附图以举例方式对本发明的实施方式进行详细描述后,本发明的其他特征、特点和优点将会更加明显。图1为本发明实施例提供的一种优化的memset标准库函数汇编代码生成方法流程不意图;图2为本发明实施例优化的填充执行片段生成的框图;图3为本发明实施例填充数据的扩展示意图;图4为本发明实施例数据填充任务的分解示意图;图5为本发明实施例基本填充模式生成时的功能筛除流程示意图;图6 (a)为本发明实施例数据规模为16的一种填充模式;图6 (b)为本发明实施例数据规模为16的另一种填充模式。
具体实施例方式下面通过附图和实施例,对本申请的技术方案做进一步的详细描述。数组的初始化工作通常由C标准中的memset标准库函数完成。由于C语言中的memset标准库函数出于兼容性考虑,在速度上落后于根据特定体系结构的目标机器写出来的汇编代码。基于优化理论基础,程序越底层,代码越容易调度,更能有效利用指令集。而汇编代码是编译器结合目标机器的硬件特性,将高级语言通过编译优化,代码块合并等操作后生成。因此,现代微处理器为了提高处理性能,很多标准库函数都是以汇编的形式内嵌静态库中。而标准库函数的优化不同于其他开发程序的优化标准库函数的行为明确,可根据其行为描述直接生成优化的代码,而非在冗余代码基础上作修改使其性能较优。在Cll 标准中,memset 标准库函数原型为 void*memset (void*s, intc, size_t, η),其中输入参数s、c和η分别对应于目标填充地址、特定填充数据和填充规模。memset标准库函数本质是将某一特定内存区域以特定单字节数据填充,通常用于为新申请的内存块进行初始化。其典型执行是单字节的数据填充,然而这种算法在内存块较小时性能尚可,当待填充的内存块较大时,多次循环耗时代价大,性能极低。因此,如何实现多字节的填充是众多memset标准库函数优化算法的设计重点。现代微处理器的指令集都提供了字节,半字、字寻址,支持多字节数据传输。为了充分发挥处理器的数据带宽,在采用多字节数据传输指令对特定内存块实现数据填充时,需要考虑目标填充地址的对齐问题。例如,4字节数据传输指令要求目标填充地址必须为4字节对齐,否则不对齐的访问会触发异常。因此,根据待填充内存地址对齐与否,选取可用的数据传输指令,是生成优化的memset标准库函数汇编代码的关键所在。另外,考虑到待填充的数据在高速缓冲存储器(Cache)中不命中时,会影响函数执行性能。因此,以Cache块大小为填充规模的上界,每次只以Cache块大小为循环填充单位,从降低Cache缺失率的角度上提高了 memset标准库函数的执行性能。综上,优化的memset标准库函数在执行时,根据输入参数,进行分支判断,依据判断结果分别跳转到具有针对性优化地填充执行片段上。因此,优化的memset标准库函数的汇编代码需要从填充数据的扩展部分、分支判断部分和优化的填充执行片段部分这几个角度由程序自动生成。图1为本发明实施例提供的一种优化的memset标准库函数汇编代码生成方法流程示意图。本发明实施例提供的一种优化的memset标准库函数的汇编代码生成方法包括分支判断部分和优化的填充执行片段部分。如图1所示,本发明实施例包括步骤101-步骤105。步骤101至步骤103主要针对分支判断部分的生成进行描述。程序生成分支判断部分时,实际上是要生成从memset标准库函数的输入参数集,到各个优化的填充执行片段集的映射关系,即每一种具体的输入参数都能够有唯一的优化的填充执行片段与之对应。而各个具体的优化的填充执行片段具有唯一属性特征,即对齐模式(输入参数中的目标填充地址s决定了目标填充地址的对齐模式,对齐模式决定了目标机器可用的数据传输指令的选择),填充规模等信息。依据目标机器的硬件特性,可得到目标机器可用的数据传输指令的对齐模式规模(如8B,4B对齐等),并以目标机器的Cache块大小为界将填充规模分类(划分成填充规模恰好各自等于O Cache块大小)。因此,具体填充执行片段集的规模为对齐模式规模X (Cache块大小+1)。综合上述对分支判断部分生成的探究,分支判断部分的生成步骤如下在步骤101,根据目标机器的硬件特性,确定待生成的优化的填充执行片段所具有的属性特征及规模。具体地,根据目标机器可用的数据传输指令的对齐模式和目标机器的Cache块大小,得到目标填充地址的对齐模式和填充规模,由此确定待生成的优化的填充执行片段的规模。在步骤102,根据所述待生成的优化的填充执行片段的规模,构造集中跳转表,集中跳转表由多条分支跳转语句构成。每条分支跳转语句旨在将执行路径引向相应的优化的填充执行片段。在步骤103,根据集中跳转表,基于目标机器可用的逻辑运算指令,对输入参数中的目标填充地址和填充规模按照待生成的优化的填充执行片段的属性特征进行分支判断,建立输入参数集到集中跳转表的映射关系,该映射关系是一对一或多对一。
需要说明的是,在分支判断部分生成之前,需要根据输入参数中的特定填充数据, 将特定单字节填充数据的位数扩展至目标机器的数据寄存器的最大位数。在Cll标准中, memset标准函数输入参数中的填充数据类型定义为整型,而在函数体中会将特定填充数据类型强制转换为无符号字符型,即memset标准函数在进行特定内存区域填充时是以Sbits 数据进行重复性填充。然而,每次进行单字节的数据填充远没有发挥处理器的数据带宽。对于一般支持多字节数据传输指令的现代微处理器而言,为了实现每次多字节的内存填充, 需要根据目标机器的硬件特性,将Sbits的填充数据进行扩展,至目标机器的数据寄存器的最大位数。数据位数的扩展可由多种方法实现,例如移位、或、加法、乘法等操作。例如, 在数据寄存器最大位数为32位的硬件平台上,其填充数据扩展示意图如图3所示。
步骤104至步骤105主要针对优化的填充执行片段部分的生成进行描述。
优化的填充执行片段部分是优化的memset标准库函数汇编代码实现数据填充的主体部分。当优化的memset标准库函数在执行时,该部分能够根据目标填充地址和填充规模,完成具有针对性优化地数据填充。根据分支判断部分中确定的待生成的优化的填充执行片段所具有的属性特征,即特定的填充要求(目标填充地址的对齐模式、填充规模),结合数据挖掘思想,生成满足特定填充要求的所有填充模式构成的填充模式集合。基于目标机器的硬件特性,通过执行代价评估,对填充模式集合进行性能筛选,得到具有最优填充性能的填充模式,由此生成优化的填充执行片段。
在步骤104,根据目标机器可用数据传输指令集、待生成的优化的填充执行片段的属性特征,即具体的填充要求,生成满足填充要求的填充模式集合。
具体地,如图2和图4所示,将填充规模为η的填充任务分解成头部填充任务、循环填充任务和尾部填充任务 ,构成循环填充的形式。
在实际运用中,当待填充的内存块区域较大时,若将整个填充规模全部展开实现一一填充,不仅得到的填充模式集合规模极大,且各个填充模式尺寸也与填充规模成线性增长,导致各个具体的优化的填充执行片段的汇编代码规模急剧。因此,在生成优化的填充执行片段的过程中,将填充规模为η的填充任务分解为头部填充任务,循环填充任务,尾部填充任务,构成循环填充的形式。根据头部填充任务,循环填充任务,尾部填充任务,分别对目标机器可用的数据传输指令集施以基本填充模式生成算法,分别得到头部填充模式集合、循环填充模式集合、尾部填充模式集合,并分别将头部填充模式集合、循环填充模式集合、尾部填充模式集合中的各个元素进行有序组合后得到组合填充模式集合,其中的各个元素,即构成了优化的填充执行片段汇编代码的主体。
以下针对基本填充模式生成算法进行描述
Memset标准库函数的行为本质为某一特定内存区域的填充。根据填充要求,结合目标机器可用的数据传输指令集及其相应的地址对齐要求,可得到满足填充要求的所有填充模式构成的填充模式集合。
在线性空间中,作如下定义集合Γ为目标机器支持的指令集,i为其中的某条具体数据传输指令(具备属性bytes,代表该指令可传输的数据字节数),则可定义集合Φ为目标机器可用的数据传输指令集(Φ = Ki e Γ ) I1. behavior_attri = M0VE_DATA_T0_ MEM}),定义满足填充要求的所有填充模式构成的集合Ψ = Ki1, i2,…,in) I (i1; i2,…,in e Φ) Λ SumQ1. bytes, i2. bytes, .··, in. bytes) = SIZE}其中,SIZE 为填充要求中的填充规模,sum为常用求和函数。由于汇编代码的实现依赖于目标硬件平台,因此填充模式的生成与目标机器的硬件特性密切相关。对于memset标准库函数而言,其行为本质是对特定内存区域进行特定单字节数据的填充。因此,在生成填充模式时,需要根据数据传输指令的地址对齐要求,对目标机器可用的数据传输指令集施以功能筛除。如果在模式生成过程中,当前地址不能满足当前填充模式生成需要的相关条件,如数据传输指令相应的地址对齐要求,则当前模式生成失效。具体功能筛除实现如图5所示,首先,遍历目标机器可用的数据传输指令集,视当前数据传输指令为i ;其次,判断当前地址是否满足当前数据传输指令相应的地址对齐要求,如果满足,则将当前的数据传输指令按序添加到当前填充模式;否则,筛除当前数据传输指令,遍历下一条数据传输指令。当前填充模式生成完成后,对其调用性能评估函数,如果当前填充模式被筛掉,则开始新一轮的填充模式生成;否则,将当前填充模式添加到填充模式集合。
·
在根据某一具体填充要求生成填充模式时,基于memset函数的行为本质,在进行功能筛除后,能够明确得到满足填充要求的所有填充模式构成的集合Ψ。对于集合Ψ中的各元素Ak (η元组(i” i2,…,in)),Ak的执行性能取决于它含有的元素个数。如在填充规模为16,其余填充要求相同的情况下,生成的两种典型的填充模式如图6 (a)和图6 (b)所示图6中(a)为典型的每次传输单字节的填充模式,图6(b)为每次传输4字节的填充模式。对比二者可知,当填充模式含有的元素个数越少时,汇编代码的规模也越小,填充数据时处理器与内存的交互次数越少。而且,对于一般的微处理器来说,单、多字节的数据传输指令执行代价上无异。因此,越精简的填充模式越能有效利用指令集,充分发挥处理器的数据带宽。因此,以填充模式的元素个数为衡量标准,对集合Ψ调用性能评估函数,经过滤除,得到最精简的填充模式填充模式。对于某一特定填充要求,其基本填充模式填充模式的生成步骤如下I、当前填充模式生成入口,2、遍历目标机器可用的数据传输指令集Φ,视当前传输指令为i,3、对指令i调用筛选函数施以功能筛选(如图5所示),若当前指令被筛选掉,则转向2,否则,转向4,4、将当前指令i按序添加到当前填充模式,并判断当前填充模式是否完成,若未完成,则转向2,否则转向5,5、对当前填充模式调用性能评估函数,若当前填充模式被滤除,则开始新一轮的填充模式生成,即转向1,否则,转向6,6、当前填充要求下的填充模式集合添加当前填充模式。在某一特定填充要求下,按上述步骤得到的填充模式集合Ψ是符合填充要求的全集,规模极大。基于库函数的行为本质可知,Ψ中至少含有一个元素,即单字节的数据填充,S卩Q1, i2,…,in)(其中i2,…,1 均为指令集中的单字节数据传输指令),虽然该元素非最优解。在步骤105,根据目标机器的硬件特性,对填充模式集合进行性能筛选,得到具有最优填充性能的填充模式,由此生成优化的填充执行片段。
对于一般的微处理器而言,汇编代码的执行代价的指标之一为指令的执行周期数,这一指标与目标机器的硬件特性密切相关,可根据不同体系结构在硬件特性自定义文件中定义。Memset标准库函数的行为本质为特定内存区域中的数据填充,因此汇编代码中的数据传输指令的执行代价在很大程度上决定了整个填充执行片段的执行代价。根据目标机器的硬件特性自定义文件中的指令执行代价信息,计算组合填充模式集合中各个填充模式执行代价总和,以指令执行代价为衡量标准,通过对组合填充模式集合进行筛选,得到执行代价最小的填充模式。由此生成具有针对性优化的具体填充执行片段。
本发明实施例基于标准库函数的行为本质,设计了一种由程序生成优化的memset 标准库函数汇编代码生成方法,该方法生成的memset标准库函数汇编代码在执行时,能够根据输入参数,实现具有针对性优化地数据填充,且只需通过修改硬件特性自定义文件,可扩展到其他基于RISC (Reduced Instruction Set Computer,精简指令集计算机)的体系结构上,可移植性较好。
显而易见,在不偏离本发明的真实精神和范围的前提下,在此描述的本发明可以有许多变化。因此,所有对于本领域技术人员来说显而易见的改变,都应包括在本权利要求书所涵盖的范围之内。本发明所要求保护的范围仅由所述的权利要求书进行限定。
权利要求
1.一种优化的memset标准库函数汇编代码生成方法,其特征在于 根据目标机器的硬件特性,确定待生成的优化的填充执行片段所具有的属性特征及规模; 根据所述待生成的优化的填充执行片段的规模,构造集中跳转表,所述集中跳转表由多条分支跳转语句构成,每条分支跳转语句旨在将执行路径引向相应的优化的填充执行片段; 根据所述集中跳转表,基于目标机器可用的逻辑运算指令,对输入参数中的目标填充地址和填充规模按照所述待生成的优化的填充执行片段的属性特征进行分支判断,建立输入参数集到所述集中跳转表的映射关系; 根据目标机器可用的数据传输指令集、所述待生成的优化的填充执行片段的属性特征,生成满足填充要求的填充模式集合; 根据所述目标机器的硬件特性,对所述填充模式集合进行性能筛选,得到具有最优填充性能的填充模式,由此生成优化的填充执行片段。
2.根据权利要求I所述的方法,其特征在于所述根据所述待生成的优化的填充执行片段的属性特征,生成满足填充要求的填充模式集合步骤包括 根据所述待生成的优化的填充执行片段的属性特征,将数据填充规模为η的填充任务分解成头部填充任务、循环填充任务和尾部填充任务; 根据所述头部填充任务、循环填充任务和尾部填充任务,分别对目标机器可用的数据传输指令集分别施以基本填充模式生成算法,得到满足所述头部填充任务、循环填充任务和尾部填充任务的头部填充模式集合、循环填充模式集合、尾部填充模式集合。
3.根据权利要求2所述的方法,其特征在于所述基本填充模式生成算法通过以下步骤实现 遍历目标机器可用的数据传输指令集; 判断当前地址是否满足当前数据传输指令相应的地址对齐要求,如果满足,则将当前的数据传输指令按序添加到当前填充模式;否则,筛除当前数据传输指令,遍历下一条数据传输指令; 当所述当前填充模式生成完成后,对所述当前填充模式进行性能评估,如果当前填充模式被滤除,则开始新一轮的填充模式生成;否则,将当前填充模式添加到填充模式集合。
4.根据权利要求3所述的方法,其特征在于对所述当前填充模式进行性能评估是以当前填充模式中的元素个数为衡量标准,对当前填充模式进行筛选。
5.根据权利要求I所述的方法,其特征在于所述根据所述目标机器的硬件特性,对所述填充模式集合进行性能筛选,得到具有最优填充性能的填充模式步骤包括 根据目标机器的硬件特性自定义文件中的指令执行代价信息,计算所述填充模式集合中各个填充模式的执行代价总和,以指令执行代价为衡量标准,通过对所述填充模式集合进行筛选,得到执行代价最小的填充模式。
6.根据权利要求I所述的方法,其特征在于在所述构造集中跳转表步骤之前还包括 根据输入参数中的特定单字节填充数据,通过目标机器支持的移位、逻辑或、加法和乘法中的一种或多种操作,将特定单字节填充数据的位数扩展至目标机器的数据寄存器的最大位数。
7.根据权利要求I所述的方法,其特征在于所述待生成的优化的填充执行片段所具有的属性特征包括目标填充地址的对齐模式和填充规模。
全文摘要
本发明公开了一种优化的memset标准库函数汇编代码生成方法,包括根据目标机器的硬件特性,确定待生成的优化的填充执行片段所具有的属性特征及规模;根据待生成的优化的填充执行片段的规模,构造集中跳转表;根据集中跳转表,对输入参数中的目标填充地址和填充规模进行分支判断,建立输入参数集到集中跳转表的映射关系;根据目标机器可用的数据传输指令集、待生成的优化的填充执行片段的属性特征,生成满足填充要求的填充模式集合;根据目标机器的硬件特性,对填充模式集合进行性能筛选,得到具有最优填充性能的填充模式,由此生成优化的填充执行片段。本发明实现了优化地数据填充,提高了memset标准库函数的数据填充性能,可移植性好。
文档编号G06F9/45GK102981886SQ201210563969
公开日2013年3月20日 申请日期2012年12月21日 优先权日2012年12月21日
发明者朱浩, 应欢, 王东辉, 洪缨 申请人:中国科学院声学研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1