<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于A(yíng)RM926EJ-S的MPEG-4軟解碼器的優(yōu)化與實(shí)現

基于A(yíng)RM926EJ-S的MPEG-4軟解碼器的優(yōu)化與實(shí)現

作者: 時(shí)間:2009-02-10 來(lái)源:網(wǎng)絡(luò ) 收藏

3.1.2 調整子塊處理以增加Cache命中率

本文引用地址:http://dyxdggzs.com/article/152648.htm

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

這個(gè)過(guò)程使解碼速度提高了將近4 f/s。

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

3.2 編寫(xiě)ARM匯編函數

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

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

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

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

3.2.2避免流水線(xiàn)阻塞

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

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

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

3.2.3盡量減少存儲器操作

將經(jīng)常使用的數據保持在寄存器中,避免每次用數據時(shí)都從存儲器讀取。尤其在IDCT中,盡量將一行或一列的數據一直保持在寄存器中,寄存器的執行效率是最高的,合理的分配寄存器和利用堆??梢允钩绦蚋鼉?yōu)。

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

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

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

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

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


W的結果等同于四個(gè)象素單獨處理的結果。但是由于A(yíng)RM處理器字讀取時(shí)是字地址對齊的,因此要注意改進(jìn)算法引起的字地址不對齊問(wèn)題,利用這個(gè)算法時(shí)可以通過(guò)拼字的方法來(lái)解決字地址對齊的問(wèn)題。

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

4結語(yǔ)

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


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>