<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于ARM926EJ-S的MPEG-4軟解碼器的優(yōu)化與實現(xiàn)

          基于ARM926EJ-S的MPEG-4軟解碼器的優(yōu)化與實現(xiàn)

          作者: 時間:2009-02-10 來源:網(wǎng)絡 收藏

          3.1.2 調(diào)整子塊處理以增加Cache命中率

          本文引用地址:http://www.ex-cimer.com/article/152648.htm

          每個宏塊由6個子塊組成。在XVID源代碼中,宏塊解碼中的6個子塊的所有處理一起進行,被放在一個大的for循環(huán)中。ARM9采用哈佛結(jié)構(gòu),分別擁有I-cache和D-cache,所有處理同時進行,某一子塊的值會一直在D-cache中不被替換,對于D-cache是非常有利的,但是對于I-cache來說卻會造成代碼的不斷替換而影響Cache效率。對于I幀,由于其數(shù)據(jù)量比較大,數(shù)據(jù)替換的開銷會遠遠大于代碼替換,因此不對其做處理。而對于P幀,由于數(shù)據(jù)量小,零值較多,數(shù)據(jù)替換開銷大大降低,因此將其6個子塊的某一處理集中進行,保證這一處理過程的代碼一直存在于I-cache中,以增加cache的命中率。具體的做法是:

          這個過程使解碼速度提高了將近4 f/s。

          另外對于I幀,IDCT與VOP重建也是可以合并的,這個過程可以減少存儲器的訪問次數(shù)。但是這個合并過程不符合ARM的Cache工作特性,因此的效果并不明顯,這也是過程中矛盾折衷的明顯體現(xiàn)。

          3.2 編寫ARM匯編函數(shù)

          ADS編譯器對C程序有很強的編譯能力,但對于一些運算量較大,涉及存儲器訪問較多的模塊,仍然需要使用ARM匯編。這部分主要是針對耗時較多的IDCT,插值,VOP重建等模塊。在書寫匯編函數(shù)時,要充分把握ARM處理器的特性,盡量避開多周期指令,避免流水線阻塞,合理分配寄存器以盡量減少存儲器操作。匯編函數(shù)的優(yōu)化包括以下幾點: 3.2.1避免多周期指令

          在ARM匯編中,相對耗時的指令主要有存儲器操作指令load/stor,程序跳轉(zhuǎn)指令B,乘法指令MUL等。在編寫匯編函數(shù)時,要盡量的考慮這些指令的替換方案。

          對于存儲器操作指令,可以采用多寄存器傳送指令LDM/STM來替換。一次LDR指令需要5個指令周期,而N個寄存器傳送的LDM指令只需要N+4個指令周期。IDCT、插值、VOP重建中的數(shù)據(jù)讀取都是連續(xù)地址操作,可以一次讀人4個甚至更多的數(shù)據(jù)到寄存器以減少程序的執(zhí)行指令周期數(shù)。

          其次,一條程序跳轉(zhuǎn)指令B需要3個指令周期,利用手寫匯編可以避免ADS編譯C時經(jīng)常出現(xiàn)的函數(shù)跳轉(zhuǎn)指令,同樣減少了執(zhí)行周期數(shù)。

          3.2.2避免流水線阻塞

          ARM9采用五級流水線,執(zhí)行效率很高,但是如果指令設置不當,很容易造成流水線阻塞而影響執(zhí)行效率。Load裝載指令和B跳轉(zhuǎn)指令是造成流水線互鎖①和刷新②的重要因素。解決流水線互鎖的辦法主要是預裝載和循環(huán)展開。

          預裝載,即將接下來要用到的數(shù)據(jù)在不影響寄存器使用的情況下提前兩個以上指令周期裝載到寄存器中。這是由于load指令裝載到寄存器的數(shù)據(jù)在接下來的2個周期中還不能被使用,會造成流水線的互鎖。

          循環(huán)展開,即將循環(huán)體內(nèi)的主體多次循環(huán)將循環(huán)跳轉(zhuǎn)次數(shù)減少。這樣不僅可以減少B跳轉(zhuǎn)指令帶來的流水線刷新,同時可以在前一個循環(huán)中通過預裝載下一個循環(huán)需要用的數(shù)據(jù)來避免流水線的互鎖。

          3.2.3盡量減少存儲器操作

          將經(jīng)常使用的數(shù)據(jù)保持在寄存器中,避免每次用數(shù)據(jù)時都從存儲器讀取。尤其在IDCT中,盡量將一行或一列的數(shù)據(jù)一直保持在寄存器中,寄存器的執(zhí)行效率是最高的,合理的分配寄存器和利用堆棧可以使程序更優(yōu)。

          一個高效的匯編程序可以使整個性能有較多的改善,通過ARM匯編函數(shù)的替換,測試序列解碼播放完畢耗時3.1 s,解碼速度提高了8 f/s。

          3.3尋找快速算法和并行算法

          ARM匯編的好處不僅在于執(zhí)行效率高,還在于可以充分利用ARM處理32位數(shù)據(jù)的特性,尋找快速算法和并行算法。

          對于插值函數(shù),可以采用并行算法來一次處理多個象素。每個象素是一個8位數(shù)據(jù),而ARM處理器是32位,因此可以改進算法一次處理4個象素。插值中的關鍵算法是:

          rounding是碼流中一個取0或1的參數(shù)。我們可以改進這個算法4個象素一起處理。通過分析知道,可以將式(1)改為A/2+B/2+C,C也應該是一個取0或者取1的值。分析的結(jié)果發(fā)現(xiàn),當rounding為0時,C=(AOB)0X01;當rounding為1時,C=(AB)0X01。此時我們可以用4個象素組成兩個32位的字W1,W2,利用公式:


          W的結(jié)果等同于四個象素單獨處理的結(jié)果。但是由于ARM處理器字讀取時是字地址對齊的,因此要注意改進算法引起的字地址不對齊問題,利用這個算法時可以通過拼字的方法來解決字地址對齊的問題。

          通過這一步驟的優(yōu)化,測試序列解碼播放完畢耗時2.56 s,解碼速度提高了6 f/s,整體解碼速度達到了37 f/s。

          4結(jié)語

          本文對在ARM平臺上的及優(yōu)化的整體思路和步驟進行了闡述,優(yōu)化結(jié)果理想,軟解碼播放速度由最初移植完畢時的10 f/s提高到了37 f/s。本文給出的優(yōu)化方案可以進一步推廣到H.264或者其他視頻軟解碼系統(tǒng)ARM的應用中。


          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();