702第7章 嵌入式系统的性能优化设计.ppt

上传人:sccc 文档编号:5581634 上传时间:2023-07-30 格式:PPT 页数:39 大小:619.51KB
返回 下载 相关 举报
702第7章 嵌入式系统的性能优化设计.ppt_第1页
第1页 / 共39页
702第7章 嵌入式系统的性能优化设计.ppt_第2页
第2页 / 共39页
702第7章 嵌入式系统的性能优化设计.ppt_第3页
第3页 / 共39页
702第7章 嵌入式系统的性能优化设计.ppt_第4页
第4页 / 共39页
702第7章 嵌入式系统的性能优化设计.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《702第7章 嵌入式系统的性能优化设计.ppt》由会员分享,可在线阅读,更多相关《702第7章 嵌入式系统的性能优化设计.ppt(39页珍藏版)》请在三一办公上搜索。

1、第7章 嵌入式系统的性能优化设计,内容,性能优化概述性能优化的方法论(Methodology)性能优化的层次软件优化的工具,7.1 性能优化概述,无论对通用桌面计算机系统,还是对在嵌入式系统而言,优化(Optimization)一直是应用程序追求的目标之一。由于嵌入式系统是一个资源受限的系统,它对程序的运行的空间和时间要求比桌面系统更为苛刻,因此,应用程序的优化对嵌入式系统来说尤显得必要和紧迫。根据优化的侧重点不同,嵌入式系统的优化大致分为:运行速度优化、代码尺寸优化和低功耗优化等三个方面。本章介绍的性能优化是指运行速度优化,而低功耗优化将在下一章中重点介绍。,7.1 性能优化概述,性能优化为

2、什么对于嵌入式系统尤其重要?价格敏感类系统希望使用尽可能便宜的硬件但是又要能提供满足应用需求的性能如各种数码产品性能critical类系统价格不敏感应用的效果取决于能达到的性能比如CT,如果计算够快,可以做实时的3D CT支持下的外科手术,7.2 性能优化的方法论(Methodology),高速化并行化流水化计算和IO的互相替代性能优化一般都有代价,7.2.1 高速化,提高时钟频率更快的CPU主频2009年2月,东芝发布了1Ghz主频的TG01智能手机Qualcomm实现的基于ARM内核的处理器更快的RAM频率SDRAM主频 66Mhz100Mh133Mhz更快的IO频率PCI 1.0 33M

3、hzPCI2.1 66MhzPCI-X 1.0 133MhzPCI-X 2.0 533Mhz一个时钟周期做一件事情一个时钟周期做多件事情内存访问方式:SDRDDRQDR(Intel Core Duo的FSB),Toshiba TG01绰号:智能怪兽,时钟可以无极限的快下去吗?在2000之前,通过集成电路的工艺的不断的深纳米化,频率可以做到越来越高180nm130nm90nm但是在2000年左右,业界发现了问题功耗越来越大,已经无法控制另外,硬件设计也变得越来越困难信号完整性问题电磁辐射、电磁兼容问题需要新的思路并行化流水化,芯片的单位面积功耗图,7.2.2 并行化,计算的并行化IO的并行化,7

4、.2.2.1 计算并行化,计算并行的尺度机器之间的并行-机群(Cluster)处理器之间的并行 对称多处理(SMP)内核之间的并行 多核同构计算并行 vs 异构计算并行同构 每个节点是同一CPU ISA(指令集架构)适合任务中的计算类型比较单一异构 节点可有不同的CPU ISA适合任务中存在多种不同类型的计算,计算异构并行的例子PCCPU+GPU(图形卡芯片)OMAPARM+C55x DSPCPU+各种加速引擎注意这些加速引擎本身不一定是处理器结构(不是图灵机),7.2.2.2 IO并行,加宽IO总线宽度比如8bit 总线16bit32bit但是IO总线过宽后,时钟频率上去后难以保证信号的完整

5、性,所以新的趋势是采用串行总线,但是提高时钟频率比如并行的PCI串行的PCI Express比如并列使用多个bank的SDRAM所有单元共享一个总线分成多个相对独立的IO总线段如PC的FSB+北桥+PCI+南桥+ISA的结构如ARM SoC中的AHB、APB结构,单一总线结构,类似于不同速度的车辆(汽车、自行车等)都行驶在一条道路上。,ARM SoC的分段总线结构,AMBA(Advanced Microcontroller Bus Architecture,高级微控制器总线架构)片上总线是基于ARM IP的SoC的一种流行结构。在AMBA中有两个总线:AHB(Advanced High per

6、formance Bus,高性能总线)主要用于高性能、高时钟频率的系统模块(如CPU、DMA和DSP等)之间的连接,它构成了SoC高性能的系统骨干总线(back-bone bus)。APB(Advanced Peripheral Bus,高级外围总线)主要用于低带宽的周边外设之间的连接,例如UART、1284等。APB通过桥接器连接到AHB上,以实现速度的上匹配。,类似于不同速度的车辆(汽车、自行车等)分道行驶。,7.2.3 流水化,福特汽车首次正式提出流水化的思想将一个操作细分为多个顺序执行的子操作每个子操作有独立的硬件来完成不能减少单个操作的端到端延时,但是可以增加单位时间内的产出。例子C

7、PU内部的执行流水线软件中常用的Double buffer(也叫乒乓buffer)机制。但是使用Buffer的两个步骤必须由不同的硬件单元执行比如声卡录制过程中。写数据的步骤是由声卡或系统的DMA引擎执行,而读是由CPU执行。否则没有提高性能的效果,Double Buffer的例子,7.2.4 计算和IO的互相替代,用IO替代计算 查找表比如一个应用中需要使用到0-180度的每隔5度的sin和cos函数的值。可以将这些值事先算出,存在一个查找表中。使用时用角度做索引即可。用计算替代IO 压缩文件比如嵌入式中一般把Linux的内核进行压缩(zImage)后存储在Flash中,读到RAM中再解开。

8、由于Flash读相对计算和RAM访问要慢很多,总体上比从Flash直接load不压缩的image要快,7.2.5 性能优化一般都有代价,最常见的是空间换时间并行化、流水化都属于此。后面讲的一些软件实现的优化,如循环展开、查找表也是如此。设计的复杂化比如多核上软件设计的难度远高于单核的情况比如流水线的不同阶段可能有互相依赖时,流水线设计变得非常复杂一个高明的设计师要懂得折中(trade-off),7.3 性能优化的层次,系统层次软硬综合的考虑软件层次在给定硬件平台下,如何充分挖掘潜力,7.3.1 系统层次,设计中充分考虑并行化、流水化,比如多处理器或多核处理器充分使用DMA引擎来做数据搬移足够的

9、IO,内存接口宽度使用双口RAM解决并发访问的竞争问题选择合适的处理器类型CPU vs DSP合理的软硬分配选择正好有带针对所需应用的关键计算步骤的加速引擎的SoC但是加速引擎往往针对一个特定的算法实现,算法一旦改变这个SOC就无用了计算密集部分考虑用FPGA实现,7.3.2 软件层次,平台无关的优化措施与具体硬件平台无关的,优化后对于任何硬件平台都有好处算法层次的优化如何降低算法的计算复杂度和数据搬移复杂度实现层次的优化在算法复杂度确定情况,如何减少实际的运算次数和数据搬移次数用户界面层次的优化与平台相关的优化与具体平台(即处理器架构)相关,利用具体平台的一些特性。,7.3.2.1 算法复杂

10、度优化,具体参考数据结构和算法复杂度课程比如计算复杂度优化冒泡排序的N2快速排序(quick sort)的NlogN傅立叶变换的FFT算法,将N点DFT(离散傅立叶变换)的乘法计算量由N2次降为(Nlog2N)/2次。,一个简单的算法复杂度优化的例子假设一个应用使用一个链表来存储一些数据,以便频繁的增加和删除数据。但是同时又经常需要使用当前链表中的单元个数的信息做法1:实现一个getLength()方法,该方法遍历一次链表获得单元数目。复杂度为N做法2:为链表类增加一个独立的长度字段,在链表插入元素和删除元素的方法中顺带更新这个长度字段。复杂度为常数。,7.3.2.2 实现优化,表达式简化a*

11、b+a*c-a*(b+c)函数调用的inline化,计算强度降低(Strength reduction)一般除法所需时间乘法所需时间加法所需时间i*3 i+i+i(x/y)/z x*z/y利用二进制的特点实现循环指针idx=idx4,循环展开全部展开,对于循环次数很多的情况,可以部分展开,循环不变量的外提,循环归并循环变量取值相同(或可以由另一个算出来),一个测试题 矩阵乘法,注意:cij每次确定元素的下标时都要做一次乘法和加法,即i*c的一维长度+j,其他例子用查找表代替运算:消除了计算的复杂度(但是增加了内存容量)Hash法代替比较:将比较的复杂度降为常数1(但也增加了内存容量,而且随着容

12、量的减少,复杂度会上升)。,7.3.2.3 用户界面层次的优化,只适用于与用户直接交互的系统在实际性能不变的条件下,让用户主观上感觉系统响应更加及时在业界称为以迂回的方式解决问题(work around solve)机顶盒项目的实际例子开机速度以前是Linux下的视频驱动加载后电视才出来图像改为在Bootloader里就先输出一副开机画面换台速度问题 用户习惯通过按住切台键不放,转到自己想看的某个台(已知序号)以前是每次切台按钮事件都会导致完整的切台动作(包括tuner频点切换,demux设置,视频解码器重新初始化等动作),从频道1频道10,需要做10次改为如果用户按住切台键不放,屏幕变黑,然

13、后只改变台标显示,直到用户停在频道10。实际只需做1次切台,7.3.2.4 平台相关的优化,利用平台特定的指令,比如ARM上利用条件执行替代条件跳转比如ARM中用Branch-and-link实现函数调用,可以节省返回地址压栈,if(i j)i-=j;else j-=i;,CMP Ri,Rj;set condition NE if(i!=j);GT if(i j),;or LT if(i j)SUBGT Ri,Ri,Rj;if GT,i=i-j;SUBLT Rj,Rj,Ri;if LT,j=j-i;,利用平台特定的结构,比如8051中利用通用寄存器shadow机制,省去中断响应过程中对寄存器的

14、现场保护ARM中带F后缀的,可以把浮点计算直接交给FPU来处理利用ARMV6中引入的SIMD扩展实现一条指令同时处理多路数据,减少cache miss如果一个数据结构大小与Cache的大小可比拟,那么尽量将该数据结构的所有处理都集中在一块完成,以免造成多次Cache loading,处理一个大数据结构A处理另一个大数据结构B又处理A,处理一个大数据结构A又处理A处理另一个大数据结构B,Cache更形动作:A装入CacheA从Cache中淘汰(即写入内存中)B装入CacheB从Cache中淘汰A装入Cache,Cache更形动作:A装入CacheA从Cache中淘汰(即写入内存中)B装入Cach

15、e,使用与处理器的自然边界对齐(alignment)的数据结构一般处理器访问内存时存在一个自然边界的概念,比如8字节对齐。如果一个数据结构的边界不在这个边界上,需要额外的一次操作。可以通过#pragma pack编译指令改变编译器缺省行为对于Intel64架构处理器(64位的x86)char c1,c2,c3;long l;,需要两条mov指令,只需一条mov指令,c3,l,流水线编排(Pipeline Scheduling)目标是减少流水线stall(空转)需要对CPU实现结构的深层了解一般Compiler会做一些这样的考虑,但是想达到最优还是得手工操作。支持乱序执行的CPU实现结构可以动态

16、的做一定程度的流水线编排但是大多数嵌入式CPU都不支持乱序执行由于难度实在太大,一般最对最关键的算法进行这样的优化。,.ADD R1,R2,R4ADD R1,R2,R4ADD R2,R2,#1LDR R4,R1ADD R3,R6,R2ADD R2,R2,#1LDR R4,R1ADD R3,R6,R2ADD R7,R4,#2 ADD R7,R4,#2,从内存Load数据一般需要多个周期,而下一条指令依赖于R4的值,所以流水线只能stall,此时可能LOAD R4已经完成,可以马上执行这条指令,流水线编排的例子,7.4 软件优化的工具,Profiling工具帮助你分析程序执行的热点,如GNU gp

17、rof某西雷工具还可以帮你分析流水线调度和Cache的miss情况比如Intel的VTune(用于Intel X86处理器)和IBM的Mambo(用于PowerPC处理器)编译器编译器可以实现部分上述的软件优化方法。某些方法是缺省就做,某些是缺省不做的,可以通过编译器命令行选项来指定现成的已经优化的常用算法库比如Intel针对于其X86处理器的 IPP(Intel Performance Primitives)和TI针对于其DSP的媒体codec实现库,GCC的与优化有关的命令行选项,细粒度的优化方法控制比如-floop-optimize(不变量外提等)-funroll-loops,-finline-functions按预定义的级别的优化控制-O1/-O 基本的优化,不涉及空间换时间的优化,比如-floop-optmize等-O2 更多一些优化,比如指令流水线编排,但仍然不涉及空间换时间的优化-O3 最高程度的优化,使用需要用空间换时间的方法,如inline函数每后一级别包括所有前一级别的措施具体参考gcc的man page需要注意这些优化会让调试时源代码和实际指令对应不上,带来一些困惑,所以调试阶段最好用-O0关闭所有优化,谢谢,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号