DSP應(yīng)用優(yōu)化技術(shù)――第二部分new_第1頁(yè)
DSP應(yīng)用優(yōu)化技術(shù)――第二部分new_第2頁(yè)
DSP應(yīng)用優(yōu)化技術(shù)――第二部分new_第3頁(yè)
DSP應(yīng)用優(yōu)化技術(shù)――第二部分new_第4頁(yè)
DSP應(yīng)用優(yōu)化技術(shù)――第二部分new_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、DSP應(yīng)用優(yōu)化技術(shù)第二部分?jǐn)?shù)字信號(hào)處理 (DSP) 是一種采用增強(qiáng)功能處理信號(hào)與數(shù)據(jù),以及修改這些信號(hào)的方法。數(shù)字信號(hào)處理技術(shù)還可用于分析信號(hào),以確定特定的信息內(nèi)容。DSP 主要涉及真實(shí)信號(hào)的處理。這些信號(hào)根據(jù)序號(hào)進(jìn)行轉(zhuǎn)換與表示。然后采用數(shù)學(xué)方法處理這些信號(hào),以便從信號(hào)提取特定信息或者以某種方式轉(zhuǎn)換信號(hào)。 DSP 一般駐留在實(shí)時(shí)嵌入式系統(tǒng),其中計(jì)算的及時(shí)性與其正確性同等重要。DSP 在這些環(huán)境中很普通,因?yàn)閷?duì)它們經(jīng)過(guò)精心設(shè)計(jì)后,可非常迅速地執(zhí)行常見(jiàn)的信號(hào)處理運(yùn)算。DSP 的可編程性使應(yīng)用能夠隨時(shí)間而改變和演進(jìn),從而為應(yīng)用供應(yīng)商提供眾多優(yōu)勢(shì)。對(duì) DSP 編程需要了解應(yīng)用、DSP 硬件架構(gòu)、以及用

2、于生成可滿足系統(tǒng)緊迫期限要求的高效實(shí)時(shí)軟件代碼生成工具。 本文是系列文章的第二部分,總結(jié)在實(shí)踐中從高性能 DSP 獲得數(shù)量級(jí)速度提高所采用的某些技術(shù)。 優(yōu)化的首要原則-切勿盲動(dòng)! 在開(kāi)始進(jìn)行任何優(yōu)化之前,您必須了解從何處著手。就性能方面來(lái)看,并非所有軟件生來(lái)相同!您必須首先了解瓶頸在何處。一旦分析了應(yīng)用,就可以開(kāi)始調(diào)整代碼。應(yīng)用程序分析意味著權(quán)衡需在每部分代碼所花費(fèi)的時(shí)間(或者所占用的內(nèi)存、所消耗的功率)。軟件的某些部分可能只執(zhí)行一次(初始化)或者只執(zhí)行少數(shù)幾次。如果費(fèi)盡心思優(yōu)化此部分代碼并非明智之舉,因?yàn)楂@得的整體節(jié)省效果會(huì)是微乎其微。更可能的情況是,會(huì)有幾部分軟件執(zhí)行很多次,盡管代碼自身可

3、能會(huì)很短,但代碼執(zhí)行頻繁意味著花費(fèi)在該代碼的總循環(huán)會(huì)很多。即使如果您在這些代碼中可以節(jié)省一、兩個(gè)循環(huán),所獲得的節(jié)省也會(huì)很可觀。這就是在調(diào)整和優(yōu)化過(guò)程中您應(yīng)該多費(fèi)些時(shí)間的地方。并行是關(guān)鍵所在 在編程超量標(biāo)及 VLIM 期間時(shí)所要遵循的標(biāo)準(zhǔn)原則是保持流水線充滿(Keep the pipelines full!)。充滿的流水線意味著有效的代碼。為了確定流水線充滿的程度,您需要費(fèi)些時(shí)間檢查匯編程序生成的匯編語(yǔ)言代碼。通??梢愿鶕?jù)代碼中NOP 的冗余性檢查低效的代碼。 為了證明在基于 VLIW 的超量標(biāo)機(jī)器中并行性的優(yōu)勢(shì),讓我們首先從圖 1 所示的簡(jiǎn)單循環(huán)程序入手。如果我們準(zhǔn)備編寫此程序的串行匯編語(yǔ)言實(shí)

4、施,其代碼會(huì)與圖 2 中的類似。此循環(huán)采用超量標(biāo)機(jī)器的兩個(gè)可用側(cè)之一。通過(guò)指令與 NOP 計(jì)數(shù),它需要 26 個(gè)循環(huán)來(lái)執(zhí)行循環(huán)的每個(gè)迭代。但是,我們可以做得更好。 在這個(gè)例子中,需要注意兩件事情。許多執(zhí)行單元并未使用,而是處于空閑狀態(tài)。這是對(duì)處理器硬件的浪費(fèi)。其次,在匯編程序的此部分存在眾多延遲間隙(準(zhǔn)確說(shuō)是 20 個(gè)),在其中 CPU 需要停滯下來(lái)等待加載或保存數(shù)據(jù)。在 CPU 停滯時(shí),不會(huì)進(jìn)行任何操作。在試圖處理大量數(shù)據(jù)時(shí),這對(duì)處理器是很糟糕的事情。 有眾多方法可以在等待數(shù)據(jù)期間保持 CPU 運(yùn)轉(zhuǎn)。我們可以執(zhí)行不依賴正在等待的數(shù)據(jù)的其他運(yùn)算。我們還可以使用超量標(biāo)結(jié)構(gòu)的兩側(cè)來(lái)幫助加載和保存其

5、他數(shù)據(jù)值。圖 3 中的代碼就是一種對(duì)串行版本的改進(jìn)。我們已經(jīng)將 NOP 的數(shù)量從 20 個(gè)降至了 5 個(gè)。我們還可以并行執(zhí)行某些步驟。第 4 行和第 5 行同時(shí)執(zhí)行向器件的兩個(gè)單元(D1 和 D2)的加載。此代碼還執(zhí)行循環(huán)前的分支運(yùn)算,然后充分利用與該運(yùn)算相關(guān)的延遲來(lái)完成當(dāng)前循環(huán)的運(yùn)算。請(qǐng)注意,在該代碼中存在新的一列,它可指定您希望將哪次執(zhí)行單元用于特定運(yùn)算。這種指定執(zhí)行單元的靈活性使您能夠更好地對(duì)運(yùn)算進(jìn)行控制。 1 void example1(float *out, float *input1, float *input2)2 3 int i;45 for(i = 0; i 100; i+)

6、 6 7 outi = input1i * input2i;8 9 圖1:簡(jiǎn)單的C循環(huán) 1 ;2 ; serial implementation of loop (26 cycles per iteration)3 ;4 L1: LDW *B+,B5 ;load Bi into B55 NOP 4 ; wait for load to complete6 7 LDW *A+,A4 ; load Ai into A48 NOP 4 ; wait for load to complete9 10 MPYSP B5,A4,A4 ; A4 = A4 * B511 NOP 3 ; wait for mu

7、lt to complete12 13 STW A4,*C+ ; store A4 in Ci14 NOP 4 ; wait got store to complete15 16 SUB i,1,i ; decrement i17 i B L1 ; if i != 0, goto L118 NOP 5 ; delay for branch圖2:C循環(huán)的串行匯編語(yǔ)言實(shí)施1 ; using delay slots and duplicate execution units of the device2 ; 10 cycles per iteration3 4 L1: LDW .D2 *B+,B5

8、;load Bi into B55 | LDW .D1 *A+,A4 ;load Ai into A46 7 NOP 2 ; wait load to complete8 SUB .L2 i,1,i ;decrement i9 i B .S1 L1 ; if i != 0, goto L11011 MPYSP .M1X B5,A4,A4 ; A4 = A4 * B512 NOP 3 ; wait mpy to complete1314 STW .D1 A4,*C+ ;store A4 into Ci圖3:C循環(huán)更具并行性的實(shí)施 循環(huán)展開(kāi) 循環(huán)展開(kāi)是一種用于提高在循環(huán)分支邏輯之間執(zhí)行的、指令數(shù)量

9、的技術(shù)。它可以降低執(zhí)行循環(huán)分支邏輯的次數(shù)。由于循環(huán)分支邏輯是額外開(kāi)銷,降低其次數(shù)可以減少開(kāi)銷,而且可以使循環(huán)主體結(jié)構(gòu)的重要部分運(yùn)行更快。通過(guò)復(fù)制循環(huán)主體一定次數(shù)、然后修改終端邏輯來(lái)理解循環(huán)主體的多個(gè)迭代,可以展開(kāi)一個(gè)循環(huán)。循環(huán)展開(kāi)的缺點(diǎn)是使用更多的片上寄存器。每個(gè)迭代需要使用不同的寄存器。一旦使用了可用的寄存器,處理器就會(huì)開(kāi)始訪問(wèn)堆棧保存所需要的數(shù)據(jù)。訪問(wèn)片外堆棧需要很高的代價(jià),并且有可能消除由展開(kāi)循環(huán)而實(shí)現(xiàn)的增益。只有在循環(huán)的單個(gè)迭代循環(huán)展開(kāi)中的運(yùn)算沒(méi)有使用處理器結(jié)構(gòu)的全部可用資源時(shí),才可以使用循環(huán)展開(kāi)。如果您對(duì)此不很確定,請(qǐng)檢查匯編語(yǔ)言輸出。另一個(gè)缺點(diǎn)是增加代碼長(zhǎng)度。展開(kāi)后的循環(huán)需要更多指

10、令,進(jìn)而需要更多內(nèi)存。 分頁(yè)軟件流水線化 最佳優(yōu)化策略之一是編寫能夠由匯編程序有效流水線化的代碼。軟件流水線化是一種有效調(diào)度循環(huán)和功能單元的優(yōu)化策略。比如在 TMS320C62x 生成中,如果匯編程序了解如何操作,則存在 8 個(gè)可以同時(shí)使用的功能單元。有時(shí)只是 C 代碼結(jié)構(gòu)的細(xì)微更改,其就有可能產(chǎn)生大為不同的結(jié)果。在軟件流水線化中,會(huì)調(diào)度循環(huán)的多個(gè)迭代來(lái)并行執(zhí)行。循環(huán)會(huì)被重新組織,其結(jié)果是流水線化后的代碼中的每個(gè)迭代都是由從原始循環(huán)中不同迭代選擇的指令序列構(gòu)成。在圖 4 所示的例子中說(shuō)明了一個(gè)帶 3 個(gè)迭代的 5 步驟循環(huán)。在管線被 primed 或者最初加載運(yùn)算時(shí),存在一個(gè)稱為 prolog

11、 的初始階段(循環(huán) n 與 n+1)。循環(huán) n+2n+4 是實(shí)際流水線化后的代碼部分。處理器就是在此部分中針對(duì)三個(gè)不同循環(huán)(1、2、3)執(zhí)行不同運(yùn)算(C、B、A)。這里存在一個(gè) epilog 部分,其中,退出循環(huán)之前執(zhí)行剩余的指令。只是一套充分利用的流水線,其可生成速度最快、效率最高的代碼。 如圖 5 所示,軟件流水線化比循環(huán)展開(kāi)速度更快,因?yàn)楸M管建立流水線的開(kāi)銷更為復(fù)雜,但是只執(zhí)行一次,而在展開(kāi)的循環(huán)中卻要執(zhí)行多次,在標(biāo)準(zhǔn)循環(huán)建立過(guò)程中會(huì)執(zhí)行許多次。 圖 4:軟件管道化的五步驟管道 圖5:標(biāo)準(zhǔn)循環(huán)開(kāi)銷與循環(huán)展開(kāi)及軟件流水線化的對(duì)比 圖 6 說(shuō)明同樣簡(jiǎn)單的部分 C 代碼以及相應(yīng)的匯編語(yǔ)言輸出。

12、在此例中,要求匯編程序嘗試流水線化代碼。匯編語(yǔ)言輸出中的流水線化后的循環(huán) prolog 和循環(huán)核心部分就是證明。在這個(gè)例子中,流水線化的代碼并未達(dá)到其最佳效果。您可以通過(guò)查看代碼流水線化后的循環(huán)核心中存在多少 NOP 來(lái)檢查低效的代碼。此例中,流水線化后的循環(huán)核心總共有 5 個(gè) NOP 循環(huán),第 16 行中 2 個(gè),第 20 行中 3 個(gè)。此循環(huán)共需要執(zhí)行 10 個(gè)循環(huán)。NOP 是能夠?qū)崿F(xiàn)更有效循環(huán)的首要證據(jù)。但是,這個(gè)循環(huán)到底能夠有多短呢?預(yù)計(jì)最小循環(huán)長(zhǎng)度的一個(gè)方法是確定哪個(gè)執(zhí)行單元使用次數(shù)最多。在該例中,單元 D 比其他任何單元使用得都更頻繁,總共使用 3 次(第14、15 與 21 行)

13、。超量標(biāo)器件存在兩側(cè),從而在最低 2 個(gè)時(shí)鐘的循環(huán)中每個(gè)時(shí)鐘可以使用每個(gè)單元兩次(D1 和 D2),即一個(gè)時(shí)鐘 2 次 D 運(yùn)算,第二個(gè)時(shí)鐘中 1 個(gè) D 單元。匯編程序具有足夠的智能在流水線的兩側(cè)使用 D 單元(第 14 行和第 15 行),從而使它能夠并行化指令并且只使用 1 個(gè)時(shí)鐘。在等待完成加載的同時(shí)可以執(zhí)行其他指令,而不是坐等 NOP 延遲浪費(fèi)時(shí)間。 分頁(yè)1 void example1(float *out, float *input1, float *input2)2 3 int i;45 for(i = 0; i 100; i+) 6 7 outi = input1i * inp

14、ut2i;8 9 1 _example1:2 ;* -*3 MVK .S2 0x64,B04 5 MVC .S2 CSR,B66 | MV .L1X B4,A37 | MV .L2X A6,B58 AND .L1X -2,B6,A09 MVC .S2X A0,CSR10 ;* -*11 L11: ; PIPED LOOP PROLOG12 ;* -*13 L12: ; PIPED LOOP KERNEL14 LDW .D2 *B5+,B4 ;15 | LDW .D1 *A3+,A0 ;16 NOP 217 B0 SUB .L2 B0,1,B0 ;18 B0 B .S2 L12 ;19 MPYS

15、P .M1X B4,A0,A0 ;20 NOP 321 STW .D1 A0,*A4+ ;22 ;* -*23 MVC .S2 B6,CSR24 B .S2 B325 NOP 526 ; BRANCH OCCURS圖 6:C 語(yǔ)言例子以及相應(yīng)流水線化的匯編語(yǔ)言輸出在循環(huán)的簡(jiǎn)例中,很明顯輸入獨(dú)立于輸出。換句話說(shuō),并不存在相關(guān)性。但是,匯編程序?qū)@點(diǎn)一無(wú)所知。匯編程序一般來(lái)說(shuō)是有點(diǎn)悲觀的小家伙。在形勢(shì)不明朗的情況下,它一般并不進(jìn)行任何優(yōu)化。匯編語(yǔ)言比較保守,會(huì)假定輸入每次通過(guò)循環(huán)時(shí)會(huì)依賴此前的輸出。如果了解了輸入與輸出無(wú)關(guān),我們就可以通過(guò)把 input1 和input2 斷言為 const 來(lái)提示

16、匯編程序,向它說(shuō)明這些字段不會(huì)改變。這是進(jìn)行軟件流水線化和節(jié)省吞吐量的切入點(diǎn)。圖 7 說(shuō)明了這種 C 代碼及其相應(yīng)匯編語(yǔ)言。 1 void example2(float *out, const float *input1, const float *input2)2 3 int i;45 for(i = 0; i 100; i+) 6 7 outi = input1i * input2i;8 9 1 _example2:2 ;* -*3 MVK .S2 0x64,B045 MVC .S2 CSR,B66 | MV .L1X B4,A37 | MV .L2X A6,B58 9 AND .L1X

17、-2,B6,A01011 MVC .S2X A0,CSR12 | SUB .L2 B0,4,B01314 ;* -*15 L8: ; PIPED LOOP PROLOG1617 LDW .D2 *B5+,B4 ;18 | LDW .D1 *A3+,A0 ;1920 NOP 12122 LDW .D2 *B5+,B4 ;23 | LDW .D1 *A3+,A0 ;24 25 B0 SUB .L2 B0,1,B0 ;2627 B0 B .S2 L9 ; 28 | LDW .D2 *B5+,B4 ;29 | LDW .D1 *A3+,A0 ;30 31 MPYSP .M1X B4,A0,A5 ;32

18、 | B0 SUB .L2 B0,1,B0 ;33 34 B0 B .S2 L9 ;35 | LDW .D2 *B5+,B4 ;36 | LDW .D1 *A3+,A0 ;37 38 MPYSP .M1X B4,A0,A5 ;39 | B0 SUB .L2 B0,1,B0 ;4041 ;* -*42 L9: ; PIPED LOOP KERNEL4344 B0 B .S2 L9 ;45 | LDW .D2 *B5+,B4 ;46 | LDW .D1 *A3+,A0 ;47 48 STW .D1 A5,*A4+ ;49 | MPYSP .M1X B4,A0,A5 ; 50 | B0 SUB .L

19、2 B0,1,B0 ;5152 ;* -*53 L10: ; PIPED LOOP EPILOG54 NOP 15556 STW .D1 A5,*A4+ ;57 | MPYSP .M1X B4,A0,A5 ;58 59 NOP 16061 STW .D1 A5,*A4+ ;62 | MPYSP .M1X B4,A0,A5 ; 64 NOP 165 STW .D1 A5,*A4+ ;66 NOP 167 STW .D1 A5,*A4+ ;68 ;* -*69 MVC .S2 B6,CSR70 B .S2 B371 NOP 572 ; BRANCH OCCURS圖 7:相應(yīng)流水線化后的匯編語(yǔ)言輸出

20、在查看此匯編語(yǔ)言時(shí)需要留意幾點(diǎn)。首先,流水線化后的循環(huán)核心已經(jīng)縮小了。事實(shí)上,現(xiàn)在循環(huán)只有 2 個(gè)循環(huán)長(zhǎng)。第 4447 行在循環(huán)的第一個(gè)循環(huán)執(zhí)行(并行指令由 | 符號(hào)表示),第 4850 行在第二個(gè)循環(huán)執(zhí)行。利用我們通過(guò) const 斷言提供的附加相關(guān)性信息,匯編程序已經(jīng)能夠充分利用這些單元中的并行優(yōu)勢(shì)來(lái)高效地調(diào)用循環(huán)的內(nèi)部部分。但是,這點(diǎn)需要一定代價(jià)。代碼的 prolog 和 epilog 部分現(xiàn)在已經(jīng)變得大得多了。更緊密的流水線化核心將需要更多啟動(dòng) (priming) 運(yùn)算來(lái)根據(jù)各種指令和分支延遲協(xié)調(diào)所有的執(zhí)行。但是,一旦啟動(dòng) (primed),核心循環(huán)就能夠以極其快的速度運(yùn)行,在循環(huán)的各

21、個(gè)迭代上執(zhí)行運(yùn)算。正如我們?cè)谇懊嫠f(shuō)明,軟件流水線化的目標(biāo)是提高經(jīng)常性事件速度。 核心在此例中就是經(jīng)常性事件,而且我們已經(jīng)大大提高了它的速度。對(duì)于循環(huán)計(jì)數(shù)比較小的循環(huán),可能不值得進(jìn)行代碼流水線化。但是,對(duì)于那些要執(zhí)行數(shù)千次的循環(huán)計(jì)數(shù)較大的循環(huán)來(lái)說(shuō),軟件流水線化是唯一的出路。 分頁(yè)在流水線化后的核心要執(zhí)行的 2 個(gè)循環(huán)中,會(huì)有許多事情發(fā)生。在匯編語(yǔ)言列表中的右列說(shuō)明每條指令執(zhí)行哪個(gè)迭代。每個(gè) 符號(hào)表示迭代計(jì)數(shù)。因此,在這個(gè)核心中,第 44 行為迭代 n+2 執(zhí)行分支,第 45 和 46 行為迭代 n+4 執(zhí)行加載,第 48 行保存迭代的結(jié)果,第 49 行為迭代 n+2 執(zhí)行乘法,而第 50 行為迭代 n+3 執(zhí)行減法,這一切全在 2 個(gè)循環(huán)中完成。一旦流水線化后的核心停止執(zhí)行,epilog 就會(huì)完成運(yùn)算。匯編程序能夠使該循環(huán)變成 2 個(gè)循環(huán)長(zhǎng),這正是我們通過(guò)檢查低效代碼版本所期望達(dá)到的結(jié)果。 流水線化的功能的代碼長(zhǎng)度有所增加,看看所生成的代碼就一目了然。這是編程人員為了追求速度而不得不面對(duì)的折中之一。 在使用堆棧的程序中,還存在必須要解決的其他問(wèn)題。匯編程序必須確定在堆棧(需要更多時(shí)間訪問(wèn))中放置哪些變量以及要在快速片上寄存器中放置哪些變量。匯編程序有時(shí)并不能確定變量的去處。它會(huì)干脆不費(fèi)神地嘗試去流水線化包含太多變量的循環(huán)。這種情況下,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論