嵌入式系統的性能優化設計_第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

提交評論