嵌入式系统的性能优化设计_第1页
嵌入式系统的性能优化设计_第2页
嵌入式系统的性能优化设计_第3页
嵌入式系统的性能优化设计_第4页
嵌入式系统的性能优化设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统的性能优化设计内容性能优化概述性能优化的方法论(Methodology)性能优化的层次软件优化的工具7.1性能优化概述无论对通用桌面计算机系统,还是对在嵌入式系统而言,优化(Optimization)一直是应用程序追求的目标之一。由于嵌入式系统是一个资源受限的系统,它对程序的运行的空间和时间要求比桌面系统更为苛刻,因此,应用程序的优化对嵌入式系统来说尤显得必要和紧迫。根据优化的侧重点不同,嵌入式系统的优化大致分为:运行速度优化、代码尺寸优化和低功耗优化等三个方面。本章介绍的性能优化是指运行速度优化,而低功耗优化将在下一章中重点介绍。7.1性能优化概述性能优化为什么对于嵌入式系统尤其重要?价格敏感类系统希望使用尽可能便宜的硬件但是又要能提供满足应用需求的性能如各种数码产品性能critical类系统价格不敏感应用的效果取决于能达到的性能比如CT,如果计算够快,可以做实时的3DCT支持下的外科手术7.2性能优化的方法论(Methodology)高速化并行化流水化计算和IO的互相替代性能优化一般都有代价7.2.1高速化提高时钟频率更快的CPU主频2009年2月,东芝发布了1Ghz主频的TG01智能手机Qualcomm实现的基于ARM内核的处理器更快的RAM频率SDRAM主频66Mhz→100Mh→133Mhz更快的IO频率PCI1.033Mhz→PCI2.166Mhz→PCI-X1.0133Mhz→PCI-X2.0533Mhz一个时钟周期做一件事情→一个时钟周期做多件事情内存访问方式:SDR→DDR→QDR(IntelCoreDuo的FSB)ToshibaTG01绰号:智能怪兽时钟可以无极限的快下去吗?在2000之前,通过集成电路的工艺的不断的深纳米化,频率可以做到越来越高180nm→130nm→90nm但是在2000年左右,业界发现了问题功耗越来越大,已经无法控制另外,硬件设计也变得越来越困难信号完整性问题电磁辐射、电磁兼容问题需要新的思路并行化流水化HotPlateNuclearReactor386486PentiumPentiumProPentium2Pentium3Pentium4(Prescott)Pentium4芯片的单位面积功耗图7.2.2并行化计算的并行化IO的并行化7.2.2.1计算并行化计算并行的尺度机器之间的并行-机群(Cluster)处理器之间的并行–

对称多处理(SMP)内核之间的并行–

多核同构计算并行vs异构计算并行同构–

每个节点是同一CPUISA(指令集架构)适合任务中的计算类型比较单一异构–

节点可有不同的CPUISA适合任务中存在多种不同类型的计算计算异构并行的例子PCCPU+GPU(图形卡芯片)OMAPARM+C55xDSPCPU+各种加速引擎注意这些加速引擎本身不一定是处理器结构(不是图灵机)7.2.2.2IO并行加宽IO总线宽度比如8bit总线→16bit→32bit但是IO总线过宽后,时钟频率上去后难以保证信号的完整性,所以新的趋势是采用串行总线,但是提高时钟频率比如并行的PCI→串行的PCIExpress比如并列使用多个bank的SDRAM所有单元共享一个总线→分成多个相对独立的IO总线段如PC的FSB+北桥+PCI+南桥+ISA的结构如ARMSoC中的AHB、APB结构单一总线结构类似于不同速度的车辆(汽车、自行车等)都行驶在一条道路上。ARMSoC的分段总线结构AMBA(AdvancedMicrocontrollerBusArchitecture,高级微控制器总线架构)片上总线是基于ARMIP的SoC的一种流行结构。在AMBA中有两个总线:

AHB(AdvancedHighperformanceBus,高性能总线)主要用于高性能、高时钟频率的系统模块(如CPU、DMA和DSP等)之间的连接,它构成了SoC高性能的系统骨干总线(back-bonebus)。

APB(AdvancedPeripheralBus,高级外围总线)主要用于低带宽的周边外设之间的连接,例如UART、1284等。

APB通过桥接器连接到AHB上,以实现速度的上匹配。类似于不同速度的车辆(汽车、自行车等)分道行驶。7.2.3流水化福特汽车首次正式提出流水化的思想将一个操作细分为多个顺序执行的子操作每个子操作有独立的硬件来完成不能减少单个操作的端到端延时,但是可以增加单位时间内的产出。例子CPU内部的执行流水线软件中常用的Doublebuffer(也叫乒乓buffer)机制。但是使用Buffer的两个步骤必须由不同的硬件单元执行比如声卡录制过程中。写数据的步骤是由声卡或系统的DMA引擎执行,而读是由CPU执行。否则没有提高性能的效果DoubleBuffer的例子7.2.4计算和IO的互相替代用IO替代计算–

查找表比如一个应用中需要使用到0-180度的每隔5度的sin和cos函数的值。可以将这些值事先算出,存在一个查找表中。使用时用角度做索引即可。用计算替代IO–

压缩文件比如嵌入式中一般把Linux的内核进行压缩(zImage)后存储在Flash中,读到RAM中再解开。由于Flash读相对计算和RAM访问要慢很多,总体上比从Flash直接load不压缩的image要快7.2.5性能优化一般都有代价最常见的是空间换时间并行化、流水化都属于此。后面讲的一些软件实现的优化,如循环展开、查找表也是如此。设计的复杂化比如多核上软件设计的难度远高于单核的情况比如流水线的不同阶段可能有互相依赖时,流水线设计变得非常复杂一个高明的设计师要懂得折中(trade-off)7.3性能优化的层次系统层次软硬综合的考虑软件层次在给定硬件平台下,如何充分挖掘潜力7.3.1系统层次设计中充分考虑并行化、流水化,比如多处理器或多核处理器充分使用DMA引擎来做数据搬移足够的IO,内存接口宽度使用双口RAM解决并发访问的竞争问题选择合适的处理器类型CPUvsDSP合理的软硬分配选择正好有带针对所需应用的关键计算步骤的加速引擎的SoC但是加速引擎往往针对一个特定的算法实现,算法一旦改变这个SOC就无用了计算密集部分考虑用FPGA实现7.3.2软件层次平台无关的优化措施与具体硬件平台无关的,优化后对于任何硬件平台都有好处算法层次的优化如何降低算法的计算复杂度和数据搬移复杂度实现层次的优化在算法复杂度确定情况,如何减少实际的运算次数和数据搬移次数用户界面层次的优化与平台相关的优化与具体平台(即处理器架构)相关,利用具体平台的一些特性。7.3.2.1算法复杂度优化具体参考数据结构和算法复杂度课程比如计算复杂度优化冒泡排序的N2→快速排序(quicksort)的NlogN傅立叶变换的FFT算法,将N点DFT(离散傅立叶变换)的乘法计算量由N2次降为(Nlog2N)/2次。一个简单的算法复杂度优化的例子假设一个应用使用一个链表来存储一些数据,以便频繁的增加和删除数据。但是同时又经常需要使用当前链表中的单元个数的信息做法1:实现一个getLength()方法,该方法遍历一次链表获得单元数目。复杂度为N做法2:为链表类增加一个独立的长度字段,在链表插入元素和删除元素的方法中顺带更新这个长度字段。复杂度为常数。7.3.2.2实现优化表达式简化a*b+a*c->a*(b+c)函数调用的inline化计算强度降低(Strengthreduction)一般除法所需时间>>乘法所需时间>>加法所需时间i*3→i+i+i(x/y)/z→x*z/y利用二进制的特点实现循环指针idx=idx<15?x+1:0→idx=(idx+1)&0xF实现乘、除法i*16→i<<4i*17→i<<4+i–

一般来说后者要快,但不一定i/16→i>>4循环展开全部展开对于循环次数很多的情况,可以部分展开循环不变量的外提循环归并循环变量取值相同(或可以由另一个算出来)一个测试题–

矩阵乘法注意:c[i][j]每次确定元素的下标时都要做一次乘法和加法,即i*c的一维长度+j其他例子用查找表代替运算:消除了计算的复杂度(但是增加了内存容量)Hash法代替比较:将比较的复杂度降为常数1(但也增加了内存容量,而且随着容量的减少,复杂度会上升)。7.3.2.3用户界面层次的优化只适用于与用户直接交互的系统在实际性能不变的条件下,让用户主观上感觉系统响应更加及时——在业界称为以迂回的方式解决问题(workaround≠solve)机顶盒项目的实际例子开机速度以前是Linux下的视频驱动加载后电视才出来图像改为在Bootloader里就先输出一副开机画面换台速度问题–

用户习惯通过按住切台键不放,转到自己想看的某个台(已知序号)以前是每次切台按钮事件都会导致完整的切台动作(包括tuner频点切换,demux设置,视频解码器重新初始化等动作),从频道1→频道10,需要做10次改为如果用户按住切台键不放,屏幕变黑,然后只改变台标显示,直到用户停在频道10。实际只需做1次切台7.3.2.4平台相关的优化利用平台特定的指令,比如ARM上利用条件执行替代条件跳转比如ARM中用Branch-and-link实现函数调用,可以节省返回地址压栈if(i>j)

i-=j;

elsej-=i;

CMPRi,Rj

; setcondition"NE"if(i!=j)

;

"GT"if(i>j),;or"LT"if(i<j)

SUBGTRi,Ri,Rj

;if"GT",i=i-j;

SUBLTRj,Rj,Ri

;if"LT",j=j-i;

利用平台特定的结构,比如8051中利用通用寄存器shadow机制,省去中断响应过程中对寄存器的现场保护ARM中带F后缀的,可以把浮点计算直接交给FPU来处理利用ARMV6中引入的SIMD扩展实现一条指令同时处理多路数据减少cachemiss如果一个数据结构大小与Cache的大小可比拟,那么尽量将该数据结构的所有处理都集中在一块完成,以免造成多次Cacheloading处理一个大数据结构A处理另一个大数据结构B又处理A处理一个大数据结构A又处理A处理另一个大数据结构BCache更形动作:A装入CacheA从Cache中淘汰(即写入内存中)B装入CacheB从Cache中淘汰A装入CacheCache更形动作:A装入CacheA从Cache中淘汰(即写入内存中)B装入Cache使用与处理器的自然边界对齐(alignment)的数据结构一般处理器访问内存时存在一个自然边界的概念,比如8字节对齐。如果一个数据结构的边界不在这个边界上,需要额外的一次操作。可以通过#pragmapack编译指令改变编译器缺省行为对于Intel64架构处理器(64位的x86)charc1,c2,c3;longl;需要两条mov指令只需一条mov指令c1c2c3l流水线编排(PipelineScheduling)目标是减少流水线stall(空转)需要对CPU实现结构的深层了解一般Compiler会做一些这样的考虑,但是想达到最优还是得手工操作。支持乱序执行的CPU实现结构可以动态的做一定程度的流水线编排但是大多数嵌入式CPU都不支持乱序执行由于难度实在太大,一般最对最关键的算法进行这样的优化。... ...ADDR1,R2,R4 ADDR1,R2,R4ADDR2,R2,#1 LDRR4,[R1]ADDR3,R6,R2 ADDR2,R2,#1LDRR4,[R1] ADDR3,R6,R2ADDR7,R4,#2 ADDR7,R4,#2

从内存Load数据一般需要多个周期,而下一条指令依赖于R4的值,所以流水线只能stall此时可能LOADR4已经完成,可以马上执行这条指令流水线编排的例子7.4软

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论