在數字基帶處理器上代碼的最佳放置
美國模擬器件公司 Jose Fridman
在手機等嵌入式系統中,除了處理器執行時間外,最重要的資源就是設備總線和存儲器接口。本文將介紹一種在使用指令高速緩存時其帶寬消耗的基礎上,統計分析高速緩存所采用的方法。這種方法是傳統基于指令周期的分析方法的補充,并且也為在外部存儲接口受限制的設備中優化應用程序提供了一種手段。在外部接口受限制的設備中優化那些使用高速緩存的應用程序的讀取帶寬,對提升指令周期性能有著良好效果。作為例子,將分析H.264視頻解碼器在AD6900中集成Blackfin DSP的運行情況。
最近幾年,高速緩沖存儲器(caches)在DSP和嵌入式系統中已經很普遍。在高速緩存出現前,嵌入式軟件需要對片內SRAM和片外SRAM、SDRAM和Flash等所有物理存儲資源中的代碼進行管理。軟件工程師必須根據運行時間統計查找所有對全部運行時間起關鍵作用的代碼模塊的位置。例如,當需要一個對運行時間非常關鍵的模塊時,例如通信系統中的數據均衡器,其代碼在執行之前必須從低速的片外存儲器移至高速的片內SRAM。這個預載入的過程確保了模塊快速執行,并且在預定義的執行時間范圍內。
然而,這種預載入過程很消耗時間,而且除了相當小的系統,這種預載入過程都會是非常復雜的。例如,現在的手機系統已經發展到了非常復雜的程度,特別是那些新一代的多模手機,其中GSM調制解調與FDD WCDMA調制解調模式共存。除了移動通信標準,手機可能還需要支持多種無線連接標準(例如IEEE 802.11無線局域網和藍牙標準)以及多媒體標準(例如MPEG-4和H.264標準)。因此無線標準的多樣性使已經很復雜軟硬件系統又增加了負擔,從而使很明確的代碼放置問題也不再容易。
而另一方面,如果我們在設計一個具有指令高速緩存的系統時沒有考慮程序代碼的合理放置,很可能會在從高速緩存獲取程序代碼以及用來存儲程序代碼的內存,由于帶寬的原因會花費很多時間。例如,如果將整個程序放在外部Flash中,這種情況就會出現。
本文中,我們將介紹一種方法,在使用指令高速緩存的條件下確定在Blackfin DSP上運行大型軟件系統中代碼段的最佳位置。我們采用該方法實現手機終端數字基帶處理器(DBB)AD6900中的代碼優化配置,同樣該方法適用于所有基于Blackfin處理器的設備。
AD6900的體系結構描述
下面簡單介紹一下AD6900 DBB處理器,AD6900的結構如圖1所示。在圖1的右上方是Blackfin處理器的子系統,其中包含Blackfin的內核、L1代碼和數據存儲器(按照caches或SRAM配置)、L2存儲器、稱作DSPDMA的Blackfin直接存儲期存取(DMA)控制器和一組用于采集和處理GSM數據的DSP外圍設備。Blackfin子系統與系統總線接口單元(SBIU)相連,SSIU是一個多端口交叉開關,提供DSP和L1存儲器以及系統其他部分之間的連接。圖的右下方是ARM926EJ-S子系統。第三級系統片內存儲器稱作系統隨機存儲器(RAM)(即L3存儲器),Blackfin和ARM內核都可訪問L3。通過外部總線控制器(EBS)、SDRAM控制器(SDC)和一個與非門閃存控制器(NFC)可訪問外部存儲器(L4)。
圖1? AD6900結構框圖
專用的APBUS子系統支持多媒體連接功能,即顯示和采集設備的接口。它包含一個并行外圍設備接口(PPI)控制器,支持10bit攝像機傳感器或視頻輸入接口(包括ITU-656和ITU-601數字視頻),以及一個用于并行LCD顯示專用外部總線接口,稱作EBUS2,它可消除噪聲并且可在主外部存儲主接口上裝入數據。多通道DMA控制器方法,稱作APPDMA,它支持幾種視頻格式,包括YUV4:2:2、YUV4:2:0、RGB565和其他格式,能滿足多媒體接口設備對數據移動的需求。
AD6900基于層次存儲系統。從Blackfin處理器的角度來看,L1存儲器僅提供了一種有限的快速零等待狀態存儲。而較低等級的存儲器(例如L2、L3和L4存儲器)提供了增大的存儲容量,但以比較低的速率接入。Blackfin DSP具有兩通道32B總線寬度、16KB指令高速緩存。
H.264視頻編解碼器
H.264視頻解碼器標準,又稱為MPEG 4 Part 10/AVC,正推動著大量新的無線手機應用。這里我們采用H.264解碼器作為在AD6900系統中放置代碼方法的一個案例,因為H.264解碼器需要高速代碼讀取帶寬。
表1? 按DSP占用百分比對H.264函數的分類統計分析
表1列出了在Blackfin DSP上運行的H.264解碼器的統計分析,展示了一些調用最頻繁的函數(整個應用中大約有100個函數)。表中提供的信息是許多分析器的典型數據,其中包括調用函數次數,總的周期數目,以及該函數對DSP處理器負載的貢獻。在這個具體的實驗中,使用一種基線分析基準來測試一段具有21個時間片(slice)(例如幀)的視頻向量,每15個預計算時間片(P-slices)構成1個I-slice的視頻矢量。與其他許多DSP類似,借助Blackfin VDSP工具可以獲取這種類型統計分析信息。使用這些信息,編碼開發商就可以注重選擇和優化那些消耗DSP指令周期最多的函數,例如_decode_residual和_filter_mb_edgev_4.ix。事實上,這兩個函數和其他一些頻繁調用的函數已經優化為匯編語言。一般,大約10%的代碼已經優化為匯編,其余90%仍為C語言。
這種統計分析中還包含每個函數基所需要的指令高速緩存線路占用數目的信息。例如,函數_decode_residual不但是消耗指令周期最多的函數,還使指令高速緩存讀取相當多的高速緩存線路。在這種情況下,僅僅這一個函數就消耗了整個H.264解碼器所需的高速緩存線路數目的10.5%。
類似的,其他函數,也許不是占用DSP指令周期最多的函數,也需要占用大量的指令高速緩存數目。在表1中我們用框線標出要求指令高速緩存線路占用率最大的三個函數,占用總數的幾乎40%。總之,DSP消耗的指令周期和指令高速緩存線路占用率無關。許多函數,也許消耗的DSP指令周期較少,但卻需要相當多的高速緩存線路占用率,而有一些消耗DSP指令周期較多的函數可能需要較少的高速緩存線路(例如,_filter_mb_edgev_4pix消耗6.7%的DSP指令周期,但只消耗0.1%的指令緩存)。
該信息之所以有用,在于當全部程序代碼都放在了低級存儲器中時,例如片外Flash存儲器,代碼讀取會消耗相當大的指令緩存帶寬。取指令所消耗的帶寬會占用視頻和臨時數據的總線資源,還會降低解碼器效率。讀取指令占用了整個解碼器所需片外存儲器帶寬的50%,而其余50%用于存儲視頻數據、查表和狀態信息。
如果將表1中強調的三個函數放在離DSP近的存儲器中,例如L1程序存儲器,那么可以節省大約40%的片外讀指令帶寬。這是根據高速緩存線路占用率進行統計分析的主要目的。
更一般地,在表2中示出了同樣的分類,但是按照指令高速緩存占用率遞減順序排列的。我們可以看見一些函數雖然并不占用太多DSP指令周期,但卻需要大量的指令高速緩存占用率。例如,如果采用傳統的基于指令周期的統計分析方法處理函數_hl_motion,那么我們可能認為并不需要優化該函數,因為它只消耗0.7%的DSP指令周期。然而,它需要占用5.5%指令緩存線路占用率,因此在這種情況下應該將該函數放置在離DSP近的存儲器中,可以大幅度提升其應用性能。
表2? 按照指令高速緩存占用率對H.264函數的分類統計分析
利用表2提供的統計分析,我們挑選那些消耗指令高速緩存最大的函數,并且將其放入L1 DSP存儲器。該函數的數量取決于系統其他部分的需求和L1存儲器可用容量。在這個具體例子中,我們有一個16KB的L1 DSP存儲器并且將它放在函數的頂層,可使程序讀取帶寬下降54%。隨著帶寬的減小,H.264解碼器占用總周期的時間將會減少10%。H.264解碼器的程序代碼長度大約為125KB,這就意味著通過重新鏈接并且將13%的代碼移動到片內存儲器,可以提升指令執行周期性能。
結論
當考慮優化應用程序時,我們常常只關注問題的一方面:應用程序所消耗DSP資源的程度,即消耗的指令周期或每秒指令數(MIPS)。然而,在許多嵌入式系統中最重要的資源除了處理器執行時間外,還有整個設備的總線及外部存儲器接口。這些資源在高集成度系統中尤其重要,例如手機中數字基帶處理器,其外部接口通常是最重要的系統資源之一。在本文中我們介紹了一種根據運行在基于指令高速緩存系統所消耗的帶寬統計分析應用程序的方法。在外部接口受限制的設備中優化那些使用高速緩存的應用程序的讀取帶寬,對提升指令周期性能有著良好效果。