新聞中心

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

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

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

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

本文引用地址:http://m.butianyuan.cn/article/152648.htm

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

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

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

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

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

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

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

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

3.2.2避免流水線阻塞

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

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

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

3.2.3盡量減少存儲(chǔ)器操作

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

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

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

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

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

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


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

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

4結(jié)語

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


上一頁 1 2 下一頁

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉