優(yōu)化DSP應用的技術(shù)
數字信號處理 (DSP) 是處理信號和數據的專(zhuān)用方法,其目的在于加強并修改這些信號。數字信號處理也用于分析信號以確定特定的信息內容。DSP主要用于處理真實(shí)世界的信號。這些信號可由數字序列進(jìn)行轉化和表示。我們后來(lái)使用數學(xué)方法處理信號,從信號中提取特定信息或以某種方式轉化信號。
DSP在實(shí)時(shí)嵌入式系統中非常普遍,在這種系統中,計算的及時(shí)性與準確性同樣重要。DSP 在這些環(huán)境中非常普遍,因為其根據設計,能夠非常迅速地執行常見(jiàn)的信號處理操作。DSP 的可編程性允許應用隨著(zhù)時(shí)間的推移而不斷變化發(fā)展,從而為應用供應商提供了眾多優(yōu)勢。進(jìn)行 DSP 編程需要熟悉應用、DSP 硬件架構以及用于編寫(xiě)高效實(shí)時(shí)軟件、并能滿(mǎn)足系統最終期限的代碼生成工具。
本文是兩篇文章中的第一篇,將探討 DSP 某些重要的軟件與系統優(yōu)化技術(shù),并將解釋采用強大處理器開(kāi)發(fā)高效嵌入式應用的某些指導原則。
優(yōu)化的第一條規則--不要!
在開(kāi)始任何優(yōu)化工作之前,您必須了解自己的方向。從性能角度講,所有軟件都是不同的!您必須首先理解瓶頸在哪里。一旦您已經(jīng)對應用進(jìn)行了描述,那么接下來(lái)就可以開(kāi)始調整代碼。描述應用是指衡量代碼每部分所需的時(shí)間(或所用的存儲器空間或功耗)。軟件的某些部分僅執行一次(如初始化)或有限的次數?;ê芏鄷r(shí)間優(yōu)化這部分代碼是不明智的,因為這樣做所得的總體節約是相對有限的。很可能的情況是,軟件的某些部分會(huì )執行許多次,盡管代碼本身很短,但執行代碼的事實(shí)常常說(shuō)明代碼的整體周期需時(shí)不菲。如果您能夠從這部分代碼中節約哪怕一兩個(gè)周期,那么所得到的節約也會(huì )相當顯著(zhù)。在調整并優(yōu)化進(jìn)程時(shí),這就是您應當花時(shí)間開(kāi)展工作的地方。
存儲器的依賴(lài)性
處理器在存儲器中存儲指令和數據。盡管人們已經(jīng)創(chuàng )建了許多具有創(chuàng )新性的方法以從存儲器中獲取指令和數據,但訪(fǎng)問(wèn)指令和數據時(shí)總會(huì )有性能損失。這就是純粹的開(kāi)銷(xiāo)了。只要能夠減少等待指令或數據存取的時(shí)間,不管怎么樣,都能夠改善應用的整體性能。舉例而言,硬件高速緩沖系統將會(huì )盡可能多的指令靠近 CPU,從而實(shí)現快速存取,通常只需一個(gè)周期即可,業(yè)經(jīng)驗證這能夠改善整體性能。DSP 擁有片上存儲器,其可存儲數據與指令。但數據和指令不能自動(dòng)放置于片上存儲器中。編程員必須對此進(jìn)行管理,只要管理有效,DSP 就可以利用片上存儲器顯著(zhù)提高性能。
嵌入式系統存儲器等級中有若干層次(見(jiàn)圖1)。第一層是芯片寄存器。這部分存儲器用于保存臨時(shí)和中間數據。編譯器在調度指令時(shí)使用寄存器。該存儲器是速度最快、價(jià)格最昂貴的(器件上的寄存器越多,器件體積就越大,這意味著(zhù)硅晶片上的器件減少,也就是說(shuō)用更多的硅芯片獲得相同數量的器件,您應該明白我的意思吧)。存儲器的下一層是高速緩沖系統。它也是即快速又昂貴,用于將指令和數據在使用指令和/或數據前移至靠近 CPU 處。存儲器的再下一層是"外部"或"片外"存儲器。該存儲器會(huì )比其他存儲器類(lèi)型的速度慢,而且價(jià)格也較便宜。這一般是不使用(存儲期限較長(cháng))數據和指令時(shí)保存的地方。從該存儲器存取信息包括更多的信號交換和控制,因此也需要更多時(shí)間。實(shí)時(shí)嵌入式設計人員的主要目的是使您將用到的任何東西盡可能靠近 CPU。這意味著(zhù)需要從外部存儲器獲取信息,使其進(jìn)入速度更快的存儲器,并使用諸如直接存儲器存?。?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/DMA">DMA)等技術(shù),以及編譯或架構技術(shù)。
為了增強采用流水線(xiàn)操作概念的處理器性能,我們使用了硬件架構技術(shù)。流水線(xiàn)處理器的原則與汽車(chē)裝配線(xiàn)沒(méi)什么兩樣。每輛汽車(chē)都通過(guò)裝配線(xiàn)被一步步組裝起來(lái)。許多輛車(chē)同時(shí)在裝配線(xiàn)上,每輛車(chē)位于裝配過(guò)程的不同環(huán)節。在裝配線(xiàn)末端會(huì )出現一輛新車(chē),緊接著(zhù)還有另一輛新車(chē)跟進(jìn),以此類(lèi)推。人們早就發(fā)現,在前一輛車(chē)完成之前即開(kāi)始下一輛新車(chē)的裝配工作,這種做法的成本效益要高得多。在流水線(xiàn)處理器中,情況也是如此。流水線(xiàn)處理器可在前一項任務(wù)完成前開(kāi)始新任務(wù)。完成率就是傳入新指令的速率。如圖 2a 和 2b 所示,指令的完成時(shí)間沒(méi)有改變。但指令的完成率提高了。
為了進(jìn)一步改善性能,我們可以使用多個(gè)流水線(xiàn)。該方法稱(chēng)作超標量,其進(jìn)一步利用了平行的概念(見(jiàn)圖 2c)。如今某些高性能數字信號處理器(如 Intel i860)就有一個(gè)超標量設計。
圖2. 非流水線(xiàn)、流水線(xiàn)和超標量執行時(shí)間表

具備多個(gè)獨立執行單元的 DSP 利用平行同時(shí)執行多個(gè)獨立指令,這將為性能改善提供立竿見(jiàn)影的效果。關(guān)鍵在于找到彼此獨立的"n"個(gè)不同指令。有時(shí),我們通過(guò)硬件完成此工作,有時(shí)則通過(guò)軟件來(lái)完成(編譯)。超長(cháng)指令字(VLIW)處理器(如 TI 的 C6200 DSP 系列產(chǎn)品)使用編譯技術(shù)可以在 8 個(gè)獨立的處理器執行單元上調度最多 8 個(gè)彼此獨立的指令。指令間的數據依賴(lài)性常常將此限制在最高速率之下,但還是能夠實(shí)現顯著(zhù)的性能。許多情況下,我們可以重新構建算法,以利用架構的優(yōu)勢,從而實(shí)現多執行單元的優(yōu)勢。 {{分頁(yè)}}
較之于流水線(xiàn)處理器而言,超標量架構可提供更多的并行處理能力。但是,如果算法或函數不能利用此并行功能的話(huà),那么多余的管道將得不到使用,就會(huì )降低能夠實(shí)現的并行量。編寫(xiě)用作快速運行于流水線(xiàn)處理器上的算法不一定能在超標量處理器上同樣高效運行。舉例而言,我們可以看看圖 4a 所示的算法。該算法的編寫(xiě)利用了流水線(xiàn)處理器的優(yōu)勢。這是在串行處理器上計算多項式的常見(jiàn)方法,因為它不必再計算 p**8, p**7 等。這節約了周期和存儲中間值的寄存器。
但就超標量器件而言,這并不是計算表達式的最佳方法。算法中的括號限制了編譯器順序計算表達式的功能。這也使得并行功能無(wú)法發(fā)揮。如果我們將此表達式分解為幾個(gè)獨立的表達式,那么編譯器就可以在超標量器件的并行管道上以任何方便的順序來(lái)安排這些獨立的表達式。這樣進(jìn)行的計算利用了較少的指令周期,而采用了更多的寄存器(如圖 4b 所示)。
上述實(shí)例說(shuō)明了為什么編程人員必須了解器件架構、編譯器以及算法,從而確定執行任何特定函數的最快方法。我們將討論利用上述高性能設備加速函數計算的其他方法。
rp = (((((((R8*p + R7) * p + R6) * p + R5) * p + R4) * p + R3) * p + R2) * p + R1) * p
圖 4a)
p2 = p * p
p3 = p * p * p
.
.
p8 = p * p * p * p * p * p * p * p
---------------------------------------------
R1p1 = R1 * p
R2p2 = R2 * p2
.
.
R8p8 = R8 * p8
----------------------------------------------
rp = 0.0F
rp += R1p1
.
.
rp += R8p8
圖 4b)
圖4. a)、編寫(xiě)可快速運行于流水線(xiàn)處理器上的算法。B)、 相同算法經(jīng)修改后在超標量處理器上快速運行。
直接存儲器存取
直接存儲器存取 (DMA)是無(wú) CPU介入情況下訪(fǎng)問(wèn)存儲器的一種方式。外設用于向內存直接寫(xiě)入并導出數據,這就減輕了 CPU 的負擔。DMA 就是另一種類(lèi)型的CPU,其唯一作用就是快速移動(dòng)數據,其優(yōu)勢則在于 CPU 可以向 DMA 發(fā)出一些指令移動(dòng)數據,隨后就可以再進(jìn)行原本的工作。DMA 在 CPU 運行的同時(shí)移動(dòng)數據(圖 5)。這實(shí)際就是另一種利用器件內置并行功能的方法。DMA 在復制大量數據時(shí)非常有用。較小的數據塊無(wú)法受益,因為還要考慮到 DMA 的設置和開(kāi)銷(xiāo)時(shí)間,反倒不如直接使用 CPU 合適。但如果明智使用的話(huà),DMA 可以節約大量時(shí)間。
圖 5. 使用 DMA 而非 CPU能夠顯著(zhù)提升性能
由于訪(fǎng)問(wèn)外部存儲器會(huì )帶來(lái)很大的性能損失,且占用 CPU 的代價(jià)不菲,因此只要有可能,就應采用 DMA。最好是在實(shí)際需要數據之前就啟動(dòng) DMA 操作。這讓CPU 同時(shí)也有工作可做,且不用強制應用等待數據的移動(dòng)。隨后,當確實(shí)需要數據時(shí),數據就已經(jīng)就位了。應用應當進(jìn)行檢查,以確認操作成功,這將要求檢查寄存器。如果操作提前完成,這將對寄存器進(jìn)行一次查詢(xún),但不會(huì )產(chǎn)生大量工作,占用寶貴的處理時(shí)間。
DMA 的常見(jiàn)用法是將數據移入或移出芯片。CPU 訪(fǎng)問(wèn)片上存儲器的速度大大快于其訪(fǎng)問(wèn)片外或外部存儲器的速度。將盡可能多的數據放于芯片上是提高性能的最佳途徑。如果被處理的數據不能全部同時(shí)放于芯片上(如大型陣列),那么數據可使用 DMA 成塊地移入或移出芯片。所有數據傳輸都可在后臺進(jìn)行,同時(shí) CPU 對數據進(jìn)行實(shí)際處理。片上存儲器的智能管理和布局可以減少數據必須移入、移出存儲器的次數。就如何使用片上存儲器開(kāi)發(fā)出智能計劃,在這項工作上投入時(shí)間和精力是值得的??傮w而言,規則就是使用 DMA 將數據移入、移出片上存儲器并在芯片上生成結果(圖 6)。由于成本和空間原因,大多數 DSP 不具備很多芯片上存儲器。這要求編程人員協(xié)調算法,以高效利用現有的片上存儲器。
為使用 DMA 測量代碼確實(shí)會(huì )產(chǎn)生一些性能損失。根據應用使用 DMA 的多少,代碼大小會(huì )上升。如果全面啟用 DMA,我們曾遇到過(guò)代碼大小增長(cháng) 50% 的情況。使用 DMA 還增加了復雜性和應用的同步化。只有在要求高吞吐量的情況下才應使用 DMA。但是,片上存儲器的智能布局和使用以及明智地使用 DMA 能夠消除大多數訪(fǎng)問(wèn)片外存儲器所帶來(lái)的性能損失。
圖 6. 使用 DMA 將數據移入、移出芯片的模板
等待狀態(tài)與探詢(xún)
就像存儲器和CPU一樣,可將DMA視為資源。在DMA操作進(jìn)行過(guò)程中,應用可以等待DMA傳輸完成,也可以繼續處理應用的另一部分,直到數據傳輸完成為止。每種方法都有其優(yōu)勢和劣勢。如果應用等待DMA傳輸完成,那么它必須探詢(xún)DMA硬件狀態(tài)寄存器,直至對比特的設置完成。這要求CPU在循環(huán)操作中檢查DMA狀態(tài)寄存器,從而導致浪費寶貴的CPU周期。 如果傳輸較短,那么這只需幾個(gè)周期就可完成,等等也是值得的。如果數據傳輸較長(cháng),應用工程師可能希望使用同步化機制,如在傳輸完成時(shí)發(fā)出信號標志一樣。在這種情況下,應用會(huì )在傳輸發(fā)生時(shí)通過(guò)系統等待信號標志。該應用將與另一個(gè)準備運行的應用進(jìn)行交換。任務(wù)交換也會(huì )導致開(kāi)銷(xiāo),因此如果任務(wù)交換產(chǎn)生的開(kāi)銷(xiāo)大于對DMA完成進(jìn)行簡(jiǎn)單探詢(xún)帶來(lái)的開(kāi)銷(xiāo),那么就不應進(jìn)行任務(wù)交換。等待時(shí)間取決于被傳輸數據的數量。
圖7顯示了檢查傳輸長(cháng)度并執行DMA探詢(xún)操作(如果只需要傳輸幾個(gè)字的話(huà))或信號標志等待操作(對較大型數據傳輸而言)的一些代碼。數據大小"平衡"長(cháng)度取決于處理器以及接口結構,應當建立起原型,以確定最佳大小。
圖8顯示了等待操作的代碼。在這種情況下,應用將進(jìn)行SEM_pend操作,以等待DMA傳輸的完成。通過(guò)暫時(shí)中止當前執行的任務(wù)并交換到另一項任務(wù)以進(jìn)行其他處理,可使應用能夠進(jìn)行其他有意義的工作。當操作系統中止一項任務(wù)而開(kāi)始執行另一項任務(wù)時(shí),會(huì )導致一定量的開(kāi)銷(xiāo)。開(kāi)銷(xiāo)量的大小取決于DSP和操作系統。
圖9顯示了探詢(xún)操作的代碼。在該例中,應用將繼續探詢(xún)DMA完成狀態(tài)寄存器以獲知操作是否完成。這要求使用CPU來(lái)進(jìn)行探詢(xún)操作。這樣做使CPU無(wú)法進(jìn)行其他有意義的工作。如果傳輸足夠短,那么CPU只需在短時(shí)間內探尋狀態(tài)寄存器,這種方法也就可以更有效。
圖7. 檢查傳輸長(cháng)度并調用驅動(dòng)程序功能的代碼片段,其將探詢(xún)DSP狀態(tài)寄存器中的DMA完成位,抑或等待操作系統信號標志。{{分頁(yè)}}
最后決策建立于數據傳輸數量以及CPU探詢(xún)必須進(jìn)行多少周期的基礎上。如果探詢(xún)所需時(shí)間少于操作系統交換任務(wù)并開(kāi)始執行新任務(wù)的開(kāi)銷(xiāo),那么這種方法就會(huì )更有效。
圖 8. 等待 DMA 完成信號標志的代碼片段
圖9. 探詢(xún) DMA 是否完成的代碼片段
內存的管理
DSP 最重要的資源之一就是其本身片上或內部的存儲器。這是大多數計算將發(fā)生的地方,因為訪(fǎng)問(wèn)該存儲器比訪(fǎng)問(wèn)片外或外部存儲器要快得多。由于許多 DSP 因為決定不可預見(jiàn)性的緣故都不具備數據高速緩沖存儲器,因此軟件設計人員將 DSP 內存看作是一種由程序員管理的高速緩沖存儲器。與程序員不能控制的處理器硬件高速緩沖存儲器數據以提高性能不同,DSP 內部數據存儲器在DSP程序員的完全控制之下。使用 DMA,數據可以在后臺進(jìn)出內存,基本或完全不受DSP CPU的干預。如果管理正確有效的話(huà),內存會(huì )成為非常有價(jià)值的資源。
安排好內存的使用并隨時(shí)管理數據進(jìn)入內存的地點(diǎn),這是相當重要的??紤]到用于眾多應用的有限內存量,并非所有的程序數據都能在應用執行時(shí)間中儲存于內存中。隨著(zhù)時(shí)間的推移,數據將被移至內存中,進(jìn)行處理,可能會(huì )被重新使用,并在不需要時(shí)移至外部存儲器中。圖10顯示了內部 DSP 存儲器在應用執行時(shí)可能的存儲器映射情況。在應用執行時(shí),不同的數據結構將移至片上存儲器中,并最終移出芯片保存到外部存儲器中,或在不需要時(shí)在內存中將其覆蓋。
圖10. 必須由程序員管理的 DSP 內存
結論
直接存儲器存取 (DMA) 是無(wú)需 CPU 干預而訪(fǎng)問(wèn)存儲器的一種方法。外設用于向內存直接寫(xiě)入并導出數據,這就減輕了 CPU 的負擔。DMA 只是另一種類(lèi)型的CPU,其唯一作用就是快速移動(dòng)數據,優(yōu)勢則在于 CPU 可以向 DMA 發(fā)出一些指令移動(dòng)數據,隨后就可以再進(jìn)行原本的工作。程序員應當充分利用 DMA 的功能,特別是對 DSP 系統中常見(jiàn)的、數據強度大的數字處理應用更是如此。DMA能夠大大減輕 CPU 的負擔,并有助于高效管理數據。
下一次,我們將討論其他一些利用 DSP 器件架構,并使用編譯器調度高效代碼的DSP 優(yōu)化技術(shù),其也能顯著(zhù)改善性能。具體的課題將包括軟件流水線(xiàn)和循環(huán)展開(kāi)技術(shù)。
參考書(shū)目
《TMS320C62X 程序員指南》,德州儀器,1997 年;
《計算機架構,量化的方法》,作者:John L Hennesey 和 David A Patterson , Morgan Kaufmann Publishers 公司1990 年版權所有,Palo Alto, CA。
評論