基于ARM926EJ-S的MPEG-4軟解碼器的優(yōu)化與實(shí)現(xiàn)
3.1.2 調(diào)整子塊處理以增加Cache命中率
本文引用地址:http://m.butianyuan.cn/article/152648.htmMPEG-4每個(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工作特性,因此優(yōu)化的效果并不明顯,這也是優(yōu)化過程中矛盾折衷的明顯體現(xiàn)。
3.2 編寫ARM匯編函數(shù)
ADS編譯器對(duì)C程序有很強(qiáng)的編譯能力,但對(duì)于一些運(yùn)算量較大,涉及存儲(chǔ)器訪問較多的模塊,仍然需要使用ARM匯編優(yōu)化。這部分主要是針對(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ì)MPEG-4軟解碼器在ARM平臺(tái)上的實(shí)現(xiàn)及優(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)用中。
評(píng)論