H264 解碼耗時分析

在數字基帶處理器上代碼的最佳放置

美國模擬器件公司 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)。然而,在許多嵌入式系統中最重要的資源除了處理器執行時間外,還有整個設備的總線及外部存儲器接口。這些資源在高集成度系統中尤其重要,例如手機中數字基帶處理器,其外部接口通常是最重要的系統資源之一。在本文中我們介紹了一種根據運行在基于指令高速緩存系統所消耗的帶寬統計分析應用程序的方法。在外部接口受限制的設備中優化那些使用高速緩存的應用程序的讀取帶寬,對提升指令周期性能有著良好效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS 7 使用iptables防火墻

# 停止firewalld服務 systemctl stop firewalld systemctl mask firewalld # 安裝iptables-services yum install iptables-services Enable the service at boot-time: # 啟動iptables服務 systemctl enable iptables # 管理iptables systemctl [stop|start|restart] ip…

Linux命令之useradd和userdel(添加、刪除用戶)

一、【useradd】:添加用戶命令 1.作用useradd或adduser命令用來建立用戶帳號和創建用戶的起始目錄,使用權限是超級用戶。 2.格式 useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name 3.主…

鏈表(Linked List)之環形鏈表

原文地址:傳送門 單向環形鏈表應用場景 Josephu(約瑟夫、約瑟夫環) 問題 Josephu 問題為&#xff1a;設編號為1&#xff0c;2&#xff0c;… n的n個人圍坐一圈&#xff0c;約定編號為k&#xff08;1<k<n&#xff09;的人從1開始報數&#xff0c;數到m 的那個人出列&…

springboot 單測加入參數_spring-boot-單元測試參數數

簡單案例RunWith(Parameterized.class)public class ParameterTest {// 2.聲明變量存放預期值和測試數據private String firstName;private String lastName;//3.聲明一個返回值 為Collection的公共靜態方法&#xff0c;并使用Parameters進行修飾Parameterized.Parameterspubli…

H.264/AVC 標準中CAVLC 和CABAC 熵編碼算法研究

http://www.paper.edu.cn/index.php/default/releasepaper/downPaper/200903-146

python ==》 元組

為何要有元組 &#xff0c;() 可存放多個值 元組不可變 更多的是用來查詢t (1,[1,3],sss,(1,2)) #t tuple(1,[1,3],sss,(1,2))print (type(t))元組可以作為字典的keyd{(1,2,3):zcx}print(d,type(d),d[(1,2,3)])索引取值d (1,2,3,4,5)print(d[1])切片goods (iphone,lenove,…

免費SSL證書(支持1.0、1.1、1.2)

由于公司要開發微信小程序&#xff0c;而微信小程序的接口需要https協議的&#xff0c;并且要支持TLS1.0、TLS1.1、TLS1.2。如果僅僅是為了開發小程序&#xff0c;安全等級又不用太高&#xff0c;可以選擇免費的SSL證書 在這里選擇騰訊云的證書&#xff0c;申請在 https://cons…

viewsource和viewparsed_Network Panel說明

一、chrome Developer Tools&#xff1a;Network Panel從網絡面板中可以獲取很多有用信息&#xff0c;如詳細的時間數據&#xff0c;http請求頭響應頭&#xff0c;cookies&#xff0c;WebSocket數據。通過分析這些數據&#xff0c;可以知道哪個資源加載耗時最久&#xff0c;誰發…

使用棧來完成一個表達式的結果

原文地址:傳送門 使用棧來完成一個表達式的結果 使用棧完成計算 一個表達式的結果 7*2*2-51-53-4 &#xff1f; 32*6-2[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XzPnJzRe-1614845779689)(https://victorfengming.gitee.io/data_algorithm/i…

JM與h264標準中的關鍵字說明

有些亂&#xff0c;先存著&#xff0c;留著看 如何結合H.264標準看JM代碼》這個web文件&#xff0c;大家都應該有了吧。不過&#xff0c;那個web文檔是“H.264樂園”群中聊天的內容 1、一個sps后&#xff0c;有若干個pps嗎&#xff1f; 這主要又編碼器決定&#xff0c;但J…

云計算(cloud computing)十大問答

本文講的是云計算&#xff08;cloud computing&#xff09;十大問答&#xff0c;【IT168 資訊】云計算這個新名詞最近甚囂塵上&#xff0c;最近周圍不少朋友都在談&#xff0c;有必要寫一個關于云計算的科普了。  一般的業界比較喜歡用一些新名詞來體現 自己的戰略眼光和與對…

3150cdn打印機清零 hl_兄弟HL-3150/3140彩色打印機粉盒清零方法,我們提前了解一下...

原標題&#xff1a;兄弟HL-3150/3140彩色打印機粉盒清零方法&#xff0c;我們提前了解一下對于兄弟品牌的打印機&#xff0c;相信各位經銷商朋友都遇到過&#xff0c;更換新的粉盒或者加粉后還會提示墨粉不足、更換碳粉盒、更換硒鼓。這個情況需要在機器上操作清零&#xff01;…

Python 關于bytes類方法對數字轉換的誤區, Json的重要性

本文起源于一次犯錯, 在發覺bytes()里面可以填數字, 轉出來的也是bytes類型, 就心急把里面的東西decode出來. 結果為空.搞來搞去以為是命令不熟練事實上錯在邏輯.a1 bytes(11, encodingutf-8) print(a1)b1 a1.decode()print(b1)a2 bytes(11) print(a2)b2 a2.decode() print…

前綴中綴后綴表達式的計算求值

原文在這里 表達式 前綴表達式(波蘭表達式) 前綴表達式又稱波蘭式,前綴表達式的運算符位于操作數之前舉例說明&#xff1a; (34)5-6 對應的前綴表達式就是 - 3 4 5 6 前綴表達式求值 前綴表達式的計算機求值 從右至左掃描表達式&#xff0c;遇到數字時&#xff0c;將數…

psnr 計算

PSNR是“Peak Signal to Noise Ratio”的縮寫&#xff0c;峰值信噪比。psnr一般是用于最大值信號和背景噪音之間的一個工程項目。 PSNR計算公式如下&#xff1a; 8bits表示法中&#xff0c;peak的最大值為255&#xff1b;MSE指Mean Square Error&#xff08;均方誤差&#xff0…

光源時間_縮短背光源的使用壽命的原因

許多場所都會使用到led這種產品&#xff0c;這種產品經常用于背光的照亮中。但是由于使用led的局限性較大&#xff0c;所以led逐漸被背光源這種產品所代替&#xff0c;常常用于背景的照亮讓宣傳圖可以展現出更好的視覺&#xff0c;這也是許多人選擇背光源的原因。那么&#xff…

《結對-貪吃蛇-需求分析》

結對編程&#xff1a;貪吃蛇項目 準備階段&#xff1a;安裝Python、pygame 編寫階段&#xff1a;1. 設置游戲窗口 2. 設置游戲必要功能&#xff1a; a)開始、暫停、退出按鈕 b)貪吃蛇身體 c)食物 d)移動貪吃蛇所需按鍵 3. 完善游戲&#xff1a;添加游戲時間、貪吃蛇失敗次數…

視頻中場的問題2009-04-03 19:38(一)

視頻中場的問題2009-04-03 19:38(一) 場的用途&#xff1a; 讓25幀/秒的電視畫面幀速率&#xff0c;變為50幀/秒。使觀眾感受到更加流暢的畫面。 (二) 場的由來&#xff1a; 在電視制作的時候&#xff0c;電視掃描一副畫面的時間根據當地交流電源的頻率來確定。比如中國交流電源…

遞歸應用場景和調用機制

原文鏈接:傳送門 遞歸 迷宮問題(回溯) 概念 簡單吶的說: 遞歸就是方法自己調用自己,每次調用時傳入不同的變量,遞歸有助于編程者解決復雜的問題,同時讓代碼變得簡潔. 案例-遞歸調用機制 打印問題 public static void test(int n){if(n>2){test(n-1);}System.out.print…

在vivado里用rtl描述_如何利用Vivado HLS處理許多位準確或任意精度數據類型

我們在設計硬件時&#xff0c;它往往是要求更精確的位寬。例如&#xff0c;一個filter的輸入是12位和一個累加器的結果只需要一個最大范圍為27位。然而對于硬件設計來說&#xff0c;使用標準的C數據類型會造成硬件成本的浪費。這就會造成我們要使用更多的LUT和寄存器&#xff0…