论文部分内容阅读
摘要:XScale体系结构以高性价比、低功耗等特点已被广泛应用到智能手机、PDA和网络产品中。文章着重分析了XScale体系结构的特性,并针对该体系结构详细介绍了在开发过程中可能使用到的与运算、处理器以及编程相关的优化策略。
关键词:嵌入式处理器;XScale;超级流水线;优化策略
0 引言
随着计算机多媒体技术及无线通信技术的发展,嵌入式系统的应用已成为生活中不可或缺的部分。不同于PC机处理器的是,嵌入式处理器除了将计算速度作为性能评价指标外,还要将系统集成度和整体功耗考虑进去。这些技术参数既相互配合、又相互制约。如何取得性能间的平衡,现已成为嵌入式处理器的重要衡量指标。XScale体系结构是采用Intel技术并同ARM v5TE架构相兼容的嵌入式微处理器的构架,它对ARM体系结构进行了增强,具有低功耗、高性价比等特点。基于XScale体系结构的嵌入式技术已被应用于消费类电子产品、实时数据采集和网络通信等广泛的领域中。XScale虽然引入了一系列高性能微处理器的设计技术,但要有效地发挥XScale体系结构的处理能力尚需高效的编译系统和支持多任务的实时操作系统的支持。本文对XScale体系结构进行了分析,并提出了性能优化的策略。
1 XScale体系结构分析
XScale运用先进的Intel设计技术,采用PBGA封装的形式,实现了ARM V5TE架构,可以在很高的主频下运行。它在数据处理、存储器系统和分支预测等方面进行了扩展和增强,在保持ARM体系结构简洁、体积小、成本低和功耗小的基础上,性能得到显著提高。
1.1 XScale超流水线技术

超级流水线结构是由整型管道、存储器管道和MAC管道构成。整型管道包括7级流水线结构,取指令1(分支目标缓冲器)→取指令2→译码→寄存/移位→ALU实现→状态执行→回复;存储器管道除包括整型管道的前5级外,后接3个高速缓存,数据Cache1、数据Cache2和数据回复Cache,共8级流水线结构;MAC管道是6~9级的流水线结构,包括整型管道的前4级和4级MAC段,以及一个数据回复Cache,其中MAC2—4的选通由数据决定。流水线结构级数越多越能提高指令的执行速度。使用分支目标缓冲器的目的在于成功地预知分支指令的结果。128个入口的分支目标缓冲器的每个入口都包含了分支指令的地址、与分支指令相联系的目标地址以及该分支的执行情况,它由协处理器15使能。分支目标缓冲器的使用旨在避免超级流水线结构中的分支延迟。
1.2 XScale存储体系
处理器的运算能力的提高要求访存带宽和速度也相应提高。为了保证内核能周期地存取指令和数据,XScale拥有32KB的数据Cache和32KB的指令Cache,以提高存储器的访问性能。拥有2KB Mini Data Cache,可以避免数据Cache内数据流存取的频繁变化。Cache和TLB都支持锁定功能,可以减少Cache和TLB替换的次数。指令和数据Cache都是具有32个入口和32路相联的Cache,每路均包含1个标志地址,32字节的高速缓存队列和1个有效位,采用循环方式进行刷新存储。微小数据Cache是1个具有32个入口和2路相联的Cache,同样采用循环方式进行刷新存储。
1.3 XScale的判断预测与条件指令

XScale采用了基于统计分析的分支预测功能组件。使用该组件可以对分支程序流程进行分析和记忆,将最可能转向的指令优先填充到流水线中,提高了流水线的利用率。在指令方面,XScale具有条件指令的功能,可根据标志位有选择地执行指令,可以将判断和跳转两个步骤放在同一条功能语句中完成,从而加快了运行速度,并节省了空间。
1.4 XSeale指令结构
针对ARM指令在某些方面数据处理能力的不足,XScale对ARM的乘/加逻辑进行了增强,同时提供了具有SIMD(单指令多数据流)特性的DSP指令,以提高多媒体的应用能力。XScale处理器还可集成Flash闪存和Wireless MMX逻辑功能,提高XScale数据处理能力。
2 性能优化策略
随着编译技术的成熟,很多编译器都实现了在编译过程中自动对应用程序进行优化,改进一些不合理的结构,生成效率较高的目标代码。但XScale体系结构的特点却给编译器的开发带来了很大的挑战。在实际的程序设计过程中,程序优化的两个目标(运行速度和代码长度)通常是互相矛盾的。为了提高程序运行效率,往往要以牺牲存储空间、增加代码数量为代价;而为了减少程序代码量、压缩存储器空间,可能又要以降低程序运行效率为代价。因此,在对程序实施优化之前,应根据实际需求确定相应的策略。在处理资源紧张的情况下,应着重考虑运行速度优化;而在存储资源使用受限的情况下,则应优先考虑代码规模的优化。
2.1 运算优化
运算优化的主要目的是通过简单的数学运算来替代较为复杂的数学运算以达到减少运算强度的目的,我们可以利用以下方式来实现:
(1)利用左/右移位操作代替乘/除2运算:通常需要乘以或除以2的幂次方都可以通过左移或右移n位来完成。实际上乘以任何一个整数都可以用移位和加法来实现。在XScale中加法和移位可以通过一条指令来完成,且执行时间少于乘法指令。
(2)利用乘法代替乘方运算:XScfle核中内建有32×8个乘法器,因此可以通过乘法运算来代替乘方运算以节约乘方函数调用的开销。
(3)利用“与”运算代替求余运算:可以通过用与(AND)指令代替求余操作(%)来提高效率。
(4)如果系统对精度要求不是很高,可以采用在DSP设计中常用的定点数模拟浮点数的方法。使用定点数模拟法,可以利用XScale的整数单元高效地实现浮点运算,但会带来一定的精度损失。如果系统对精度要求较严格,则需要根据XScale构架的特点,编写效率更高的浮点运算函数库。
(5)XScale指令集中没有整数除法指令以及除法组件,除法是通过调用C库函数实现的。实现一个32位的除法通常需要20~140个时钟周期。因此,除法成了一个程序效率的瓶颈,应尽量避免使用。有些除法可用乘法代替,例如:if((x/y)>z)可变成为if(x>(y×z))。在能满足精度,且存储器空间冗余的情况下,也可考虑使用查表法代替除法。当除数为2的幂次方时,可应用移位操作代替除法。
2.2 处理器相关优化
超级流水线的优化主要集中在对流水线延迟/阻断的处理上,随着数据吞吐量的增加,流水线延迟/阻断会对系统的性能造成影响。在优化过程中,可以采用分而治之的策略来处理延迟。对于数据冲突和资源冲突引发的延迟,可以通过调整指令 执行的先后次序,消除发生冲突的条件;对于分支转移引发的延迟,应充分利用XScale微架构提供的条件执行语句,减少由于程序跳转执行而引起的流水线停滞。流水线阻断的情况则可通过循环拆解的方法加以改善。减小跳转指令在循环指令中所占的比重,能提高代码效率。
存储器访问的优化主要集中在对Cache的优化上:提高Cache的利用率,减少访问内存的次数,使得处理器尽可能从Cache获得存储器数据,因为CPU对寄存器的存取要比对内存的存取快很多。因此为变量分配一个寄存器,将有助于代码的优化和运行效率的提高。整型、指针、浮点等类型的变量都可以分配寄存器;一个结构的部分或者全部也可以分配寄存器;对循环体中需要频繁访问的变量分配寄存器也能在一定程度上提高程序的效率。尽量将栈空间、视频缓冲区和媒体流等存储器数据加载到Mini Data Cache中,可防止Cache的频繁变化。在处理器资源紧张而存储器资源相对富裕的情况下,也可以用牺牲存储空间换取运行速度的办法。
2.3 编程优化
使用inline函数 支持Xscale体系结构的大多数编译器都支持inline关键字,如果函数被定义为一个inline函数,那么在调用它的地方将会用函数体来替代函数调用语句,这样将彻底省去函数调用的开销。使用inline的最大缺点是函数在被频繁调用时,代码量将增大。
变量定义优化 在变量定义的时候,需要考虑怎样最佳地控制存储器布局(如图2所示)。当然,编译器在一定程度上能够优化这类问题,但是最好的方法还是在编程的时候,把所有相同类型的变量放在一起定义。在定义局部变量时,一般情况下人们总是设法使用short或char来定义变量以节省存储器空间,但是,在函数局部变量的数目有限的情况下,编译器会把局部变量分配给内部寄存器,每个变量占用一个寄存器,这样,使用short和char型变量非但起不到节省空间的作用,还会增加开销。增加局部变量可以减少CPU对存储器的访问频度。
参数传递优化 根据ARM统一的函数过程调用标准,寄存器组中的(R0~R3)作为参数传递和结果返回寄存器;如果参数数目超过4个,则使用堆栈进行传递。显然,通过堆栈传送参数的开销较大。我们知道内部寄存器的访问速度是远远大于存储器的,所以要使参数传递在寄存器里进行,应尽量控制函数参数在4个以下,以降低函数调用的开销。
循环条件优化 在一个循环结构中,累加法比递减法多用了一条指令,当循环次数比较大的时候,相应的两段代码就会在性能上产生出明显的差异来。其中的原因在于,当进行一个非零常数比较时,必须用专门的CMP指令来执行;而当一个变量与零进行比较时,ARM指令可以直接利用条件执行的特性(NE)来判别。循环的终止条件会影响循环的效率,再加上ARM指令的条件执行特性,所以在写循环的终止条件时应尽量使用count-down-to-zero结构。编译器可以用一条BNE(若非零则跳转)指令代码代替CMP(比较)和BLE(若小于则跳转)两条指令,既减小代码尺寸,又加快了运行速度。
条件执行优化 条件执行优化既可以缩短代码长度,又可以优化流程控制。在充分利用条件执行情况下,可以从一次比较判断得到多个跳转分支。在ARM指令集中,其中一个重要特征就是所有的指令均可包含一个可选的条件码。当程序状态寄存器(PSR)中的条件码标志满足指定条件时,带条件码的指令才能执行。可以发现,利用条件执行通常可以省去单独的判断指令;然而如果条件执行语句太多,性能上会有所降低。如果一个条件执行指令组的数目超过3条,则可以考虑用跳转指令来进行条件分支,以提高条件判决的速度。
3 结束语
在嵌入式技术飞速发展的今天,XScale处理器以其高性价比、低功耗被广泛应用。本文通过对XScale体系结构的详细分析,针对该体系的特点进行了运算优化、处理器相关的优化以及编程优化。这些优化能够有效地提高程序的性能。希望本文能够对使用XScale体系结构的开发者提供帮助。
关键词:嵌入式处理器;XScale;超级流水线;优化策略
0 引言
随着计算机多媒体技术及无线通信技术的发展,嵌入式系统的应用已成为生活中不可或缺的部分。不同于PC机处理器的是,嵌入式处理器除了将计算速度作为性能评价指标外,还要将系统集成度和整体功耗考虑进去。这些技术参数既相互配合、又相互制约。如何取得性能间的平衡,现已成为嵌入式处理器的重要衡量指标。XScale体系结构是采用Intel技术并同ARM v5TE架构相兼容的嵌入式微处理器的构架,它对ARM体系结构进行了增强,具有低功耗、高性价比等特点。基于XScale体系结构的嵌入式技术已被应用于消费类电子产品、实时数据采集和网络通信等广泛的领域中。XScale虽然引入了一系列高性能微处理器的设计技术,但要有效地发挥XScale体系结构的处理能力尚需高效的编译系统和支持多任务的实时操作系统的支持。本文对XScale体系结构进行了分析,并提出了性能优化的策略。
1 XScale体系结构分析
XScale运用先进的Intel设计技术,采用PBGA封装的形式,实现了ARM V5TE架构,可以在很高的主频下运行。它在数据处理、存储器系统和分支预测等方面进行了扩展和增强,在保持ARM体系结构简洁、体积小、成本低和功耗小的基础上,性能得到显著提高。
1.1 XScale超流水线技术

超级流水线结构是由整型管道、存储器管道和MAC管道构成。整型管道包括7级流水线结构,取指令1(分支目标缓冲器)→取指令2→译码→寄存/移位→ALU实现→状态执行→回复;存储器管道除包括整型管道的前5级外,后接3个高速缓存,数据Cache1、数据Cache2和数据回复Cache,共8级流水线结构;MAC管道是6~9级的流水线结构,包括整型管道的前4级和4级MAC段,以及一个数据回复Cache,其中MAC2—4的选通由数据决定。流水线结构级数越多越能提高指令的执行速度。使用分支目标缓冲器的目的在于成功地预知分支指令的结果。128个入口的分支目标缓冲器的每个入口都包含了分支指令的地址、与分支指令相联系的目标地址以及该分支的执行情况,它由协处理器15使能。分支目标缓冲器的使用旨在避免超级流水线结构中的分支延迟。
1.2 XScale存储体系
处理器的运算能力的提高要求访存带宽和速度也相应提高。为了保证内核能周期地存取指令和数据,XScale拥有32KB的数据Cache和32KB的指令Cache,以提高存储器的访问性能。拥有2KB Mini Data Cache,可以避免数据Cache内数据流存取的频繁变化。Cache和TLB都支持锁定功能,可以减少Cache和TLB替换的次数。指令和数据Cache都是具有32个入口和32路相联的Cache,每路均包含1个标志地址,32字节的高速缓存队列和1个有效位,采用循环方式进行刷新存储。微小数据Cache是1个具有32个入口和2路相联的Cache,同样采用循环方式进行刷新存储。
1.3 XScale的判断预测与条件指令

XScale采用了基于统计分析的分支预测功能组件。使用该组件可以对分支程序流程进行分析和记忆,将最可能转向的指令优先填充到流水线中,提高了流水线的利用率。在指令方面,XScale具有条件指令的功能,可根据标志位有选择地执行指令,可以将判断和跳转两个步骤放在同一条功能语句中完成,从而加快了运行速度,并节省了空间。
1.4 XSeale指令结构
针对ARM指令在某些方面数据处理能力的不足,XScale对ARM的乘/加逻辑进行了增强,同时提供了具有SIMD(单指令多数据流)特性的DSP指令,以提高多媒体的应用能力。XScale处理器还可集成Flash闪存和Wireless MMX逻辑功能,提高XScale数据处理能力。
2 性能优化策略
随着编译技术的成熟,很多编译器都实现了在编译过程中自动对应用程序进行优化,改进一些不合理的结构,生成效率较高的目标代码。但XScale体系结构的特点却给编译器的开发带来了很大的挑战。在实际的程序设计过程中,程序优化的两个目标(运行速度和代码长度)通常是互相矛盾的。为了提高程序运行效率,往往要以牺牲存储空间、增加代码数量为代价;而为了减少程序代码量、压缩存储器空间,可能又要以降低程序运行效率为代价。因此,在对程序实施优化之前,应根据实际需求确定相应的策略。在处理资源紧张的情况下,应着重考虑运行速度优化;而在存储资源使用受限的情况下,则应优先考虑代码规模的优化。
2.1 运算优化
运算优化的主要目的是通过简单的数学运算来替代较为复杂的数学运算以达到减少运算强度的目的,我们可以利用以下方式来实现:
(1)利用左/右移位操作代替乘/除2运算:通常需要乘以或除以2的幂次方都可以通过左移或右移n位来完成。实际上乘以任何一个整数都可以用移位和加法来实现。在XScale中加法和移位可以通过一条指令来完成,且执行时间少于乘法指令。
(2)利用乘法代替乘方运算:XScfle核中内建有32×8个乘法器,因此可以通过乘法运算来代替乘方运算以节约乘方函数调用的开销。
(3)利用“与”运算代替求余运算:可以通过用与(AND)指令代替求余操作(%)来提高效率。
(4)如果系统对精度要求不是很高,可以采用在DSP设计中常用的定点数模拟浮点数的方法。使用定点数模拟法,可以利用XScale的整数单元高效地实现浮点运算,但会带来一定的精度损失。如果系统对精度要求较严格,则需要根据XScale构架的特点,编写效率更高的浮点运算函数库。
(5)XScale指令集中没有整数除法指令以及除法组件,除法是通过调用C库函数实现的。实现一个32位的除法通常需要20~140个时钟周期。因此,除法成了一个程序效率的瓶颈,应尽量避免使用。有些除法可用乘法代替,例如:if((x/y)>z)可变成为if(x>(y×z))。在能满足精度,且存储器空间冗余的情况下,也可考虑使用查表法代替除法。当除数为2的幂次方时,可应用移位操作代替除法。
2.2 处理器相关优化
超级流水线的优化主要集中在对流水线延迟/阻断的处理上,随着数据吞吐量的增加,流水线延迟/阻断会对系统的性能造成影响。在优化过程中,可以采用分而治之的策略来处理延迟。对于数据冲突和资源冲突引发的延迟,可以通过调整指令 执行的先后次序,消除发生冲突的条件;对于分支转移引发的延迟,应充分利用XScale微架构提供的条件执行语句,减少由于程序跳转执行而引起的流水线停滞。流水线阻断的情况则可通过循环拆解的方法加以改善。减小跳转指令在循环指令中所占的比重,能提高代码效率。
存储器访问的优化主要集中在对Cache的优化上:提高Cache的利用率,减少访问内存的次数,使得处理器尽可能从Cache获得存储器数据,因为CPU对寄存器的存取要比对内存的存取快很多。因此为变量分配一个寄存器,将有助于代码的优化和运行效率的提高。整型、指针、浮点等类型的变量都可以分配寄存器;一个结构的部分或者全部也可以分配寄存器;对循环体中需要频繁访问的变量分配寄存器也能在一定程度上提高程序的效率。尽量将栈空间、视频缓冲区和媒体流等存储器数据加载到Mini Data Cache中,可防止Cache的频繁变化。在处理器资源紧张而存储器资源相对富裕的情况下,也可以用牺牲存储空间换取运行速度的办法。
2.3 编程优化
使用inline函数 支持Xscale体系结构的大多数编译器都支持inline关键字,如果函数被定义为一个inline函数,那么在调用它的地方将会用函数体来替代函数调用语句,这样将彻底省去函数调用的开销。使用inline的最大缺点是函数在被频繁调用时,代码量将增大。
变量定义优化 在变量定义的时候,需要考虑怎样最佳地控制存储器布局(如图2所示)。当然,编译器在一定程度上能够优化这类问题,但是最好的方法还是在编程的时候,把所有相同类型的变量放在一起定义。在定义局部变量时,一般情况下人们总是设法使用short或char来定义变量以节省存储器空间,但是,在函数局部变量的数目有限的情况下,编译器会把局部变量分配给内部寄存器,每个变量占用一个寄存器,这样,使用short和char型变量非但起不到节省空间的作用,还会增加开销。增加局部变量可以减少CPU对存储器的访问频度。
参数传递优化 根据ARM统一的函数过程调用标准,寄存器组中的(R0~R3)作为参数传递和结果返回寄存器;如果参数数目超过4个,则使用堆栈进行传递。显然,通过堆栈传送参数的开销较大。我们知道内部寄存器的访问速度是远远大于存储器的,所以要使参数传递在寄存器里进行,应尽量控制函数参数在4个以下,以降低函数调用的开销。
循环条件优化 在一个循环结构中,累加法比递减法多用了一条指令,当循环次数比较大的时候,相应的两段代码就会在性能上产生出明显的差异来。其中的原因在于,当进行一个非零常数比较时,必须用专门的CMP指令来执行;而当一个变量与零进行比较时,ARM指令可以直接利用条件执行的特性(NE)来判别。循环的终止条件会影响循环的效率,再加上ARM指令的条件执行特性,所以在写循环的终止条件时应尽量使用count-down-to-zero结构。编译器可以用一条BNE(若非零则跳转)指令代码代替CMP(比较)和BLE(若小于则跳转)两条指令,既减小代码尺寸,又加快了运行速度。
条件执行优化 条件执行优化既可以缩短代码长度,又可以优化流程控制。在充分利用条件执行情况下,可以从一次比较判断得到多个跳转分支。在ARM指令集中,其中一个重要特征就是所有的指令均可包含一个可选的条件码。当程序状态寄存器(PSR)中的条件码标志满足指定条件时,带条件码的指令才能执行。可以发现,利用条件执行通常可以省去单独的判断指令;然而如果条件执行语句太多,性能上会有所降低。如果一个条件执行指令组的数目超过3条,则可以考虑用跳转指令来进行条件分支,以提高条件判决的速度。
3 结束语
在嵌入式技术飞速发展的今天,XScale处理器以其高性价比、低功耗被广泛应用。本文通过对XScale体系结构的详细分析,针对该体系的特点进行了运算优化、处理器相关的优化以及编程优化。这些优化能够有效地提高程序的性能。希望本文能够对使用XScale体系结构的开发者提供帮助。