新聞中心

        EEPW首頁 > 汽車電子 > 設計應用 > 優化DSP應用的技術

        優化DSP應用的技術

        ——
        作者:TI/Rob Oshana 時間:2006-09-29 來源:電子產品世界 收藏
        介紹

        數字信號處理 () 是處理信號和數據的專用方法,其目的在于加強并修改這些信號。數字信號處理也用于分析信號以確定特定的信息內容。主要用于處理真實世界的信號。這些信號可由數字序列進行轉化和表示。我們后來使用數學方法處理信號,從信號中提取特定信息或以某種方式轉化信號。

        在實時中非常普遍,在這種系統中,計算的及時性與準確性同樣重要。DSP 在這些環境中非常普遍,因為其根據設計,能夠非常迅速地執行常見的信號處理操作。DSP 的可編程性允許應用隨著時間的推移而不斷變化發展,從而為應用供應商提供了眾多優勢。進行 DSP 編程需要熟悉應用、DSP 硬件架構以及用于編寫高效實時軟件、并能滿足系統最終期限的代碼生成工具。

        本文是兩篇文章中的第一篇,將探討 DSP 某些重要的軟件與系統優化技術,并將解釋采用強大處理器開發高效嵌入式應用的某些指導原則。

        優化的第一條規則--不要!

        在開始任何優化工作之前,您必須了解自己的方向。從性能角度講,所有軟件都是不同的!您必須首先理解瓶頸在哪里。一旦您已經對應用進行了描述,那么接下來就可以開始調整代碼。描述應用是指衡量代碼每部分所需的時間(或所用的存儲器空間或功耗)。軟件的某些部分僅執行一次(如初始化)或有限的次數?;ê芏鄷r間優化這部分代碼是不明智的,因為這樣做所得的總體節約是相對有限的。很可能的情況是,軟件的某些部分會執行許多次,盡管代碼本身很短,但執行代碼的事實常常說明代碼的整體周期需時不菲。如果您能夠從這部分代碼中節約哪怕一兩個周期,那么所得到的節約也會相當顯著。在調整并優化進程時,這就是您應當花時間開展工作的地方。

        存儲器的依賴性

        處理器在存儲器中存儲指令和數據。盡管人們已經創建了許多具有創新性的方法以從存儲器中獲取指令和數據,但訪問指令和數據時總會有性能損失。這就是純粹的開銷了。只要能夠減少等待指令或數據存取的時間,不管怎么樣,都能夠改善應用的整體性能。舉例而言,硬件高速緩沖系統將會盡可能多的指令靠近 CPU,從而實現快速存取,通常只需一個周期即可,業經驗證這能夠改善整體性能。DSP 擁有片上存儲器,其可存儲數據與指令。但數據和指令不能自動放置于片上存儲器中。編程員必須對此進行管理,只要管理有效,DSP 就可以利用片上存儲器顯著提高性能。

        存儲器等級中有若干層次(見圖1)。第一層是芯片寄存器。這部分存儲器用于保存臨時和中間數據。編譯器在調度指令時使用寄存器。該存儲器是速度最快、價格最昂貴的(器件上的寄存器越多,器件體積就越大,這意味著硅晶片上的器件減少,也就是說用更多的硅芯片獲得相同數量的器件,您應該明白我的意思吧)。存儲器的下一層是高速緩沖系統。它也是即快速又昂貴,用于將指令和數據在使用指令和/或數據前移至靠近 CPU 處。存儲器的再下一層是"外部"或"片外"存儲器。該存儲器會比其他存儲器類型的速度慢,而且價格也較便宜。這一般是不使用(存儲期限較長)數據和指令時保存的地方。從該存儲器存取信息包括更多的信號交換和控制,因此也需要更多時間。實時嵌入式設計人員的主要目的是使您將用到的任何東西盡可能靠近 CPU。這意味著需要從外部存儲器獲取信息,使其進入速度更快的存儲器,并使用諸如直接存儲器存取()等技術,以及編譯或架構技術。

                           層次

        為了增強采用流水線操作概念的處理器性能,我們使用了硬件架構技術。流水線處理器的原則與汽車裝配線沒什么兩樣。每輛汽車都通過裝配線被一步步組裝起來。許多輛車同時在裝配線上,每輛車位于裝配過程的不同環節。在裝配線末端會出現一輛新車,緊接著還有另一輛新車跟進,以此類推。人們早就發現,在前一輛車完成之前即開始下一輛新車的裝配工作,這種做法的成本效益要高得多。在流水線處理器中,情況也是如此。流水線處理器可在前一項任務完成前開始新任務。完成率就是傳入新指令的速率。如圖 2a 和 2b 所示,指令的完成時間沒有改變。但指令的完成率提高了。

        為了進一步改善性能,我們可以使用多個流水線。該方法稱作超標量,其進一步利用了平行的概念(見圖 2c)。如今某些高性能數字信號處理器(如 Intel i860)就有一個超標量設計。


                        非流水線、流水線和超標量執行時間表


                                          圖2. 非流水線、流水線和超標量執行時間表


                                                   標量構架
        具備多個獨立執行單元的 DSP 利用平行同時執行多個獨立指令,這將為性能改善提供立竿見影的效果。關鍵在于找到彼此獨立的"n"個不同指令。有時,我們通過硬件完成此工作,有時則通過軟件來完成(編譯)。超長指令字(VLIW)處理器(如 TI 的 C6200 DSP 系列產品)使用編譯技術可以在 8 個獨立的處理器執行單元上調度最多 8 個彼此獨立的指令。指令間的數據依賴性常常將此限制在最高速率之下,但還是能夠實現顯著的性能。許多情況下,我們可以重新構建算法,以利用架構的優勢,從而實現多執行單元的優勢。 {{分頁}}

        較之于流水線處理器而言,超標量架構可提供更多的并行處理能力。但是,如果算法或函數不能利用此并行功能的話,那么多余的管道將得不到使用,就會降低能夠實現的并行量。編寫用作快速運行于流水線處理器上的算法不一定能在超標量處理器上同樣高效運行。舉例而言,我們可以看看圖 4a 所示的算法。該算法的編寫利用了流水線處理器的優勢。這是在串行處理器上計算多項式的常見方法,因為它不必再計算 p**8, p**7 等。這節約了周期和存儲中間值的寄存器。

        但就超標量器件而言,這并不是計算表達式的最佳方法。算法中的括號限制了編譯器順序計算表達式的功能。這也使得并行功能無法發揮。如果我們將此表達式分解為幾個獨立的表達式,那么編譯器就可以在超標量器件的并行管道上以任何方便的順序來安排這些獨立的表達式。這樣進行的計算利用了較少的指令周期,而采用了更多的寄存器(如圖 4b 所示)。

        上述實例說明了為什么編程人員必須了解器件架構、編譯器以及算法,從而確定執行任何特定函數的最快方法。我們將討論利用上述高性能設備加速函數計算的其他方法。


        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)、編寫可快速運行于流水線處理器上的算法。B)、 相同算法經修改后在超標量處理器上快速運行。

        直接存儲器存取

        直接存儲器存取 ()是無 CPU介入情況下訪問存儲器的一種方式。外設用于向內存直接寫入并導出數據,這就減輕了 CPU 的負擔。 就是另一種類型的CPU,其唯一作用就是快速移動數據,其優勢則在于 CPU 可以向 DMA 發出一些指令移動數據,隨后就可以再進行原本的工作。DMA 在 CPU 運行的同時移動數據(圖 5)。這實際就是另一種利用器件內置并行功能的方法。DMA 在復制大量數據時非常有用。較小的數據塊無法受益,因為還要考慮到 DMA 的設置和開銷時間,反倒不如直接使用 CPU 合適。但如果明智使用的話,DMA 可以節約大量時間。


                                   使用 dma 而非 cpu 能夠顯著提升性能


                                     圖 5. 使用 DMA 而非 CPU能夠顯著提升性能

        由于訪問外部存儲器會帶來很大的性能損失,且占用 CPU 的代價不菲,因此只要有可能,就應采用 DMA。最好是在實際需要數據之前就啟動 DMA 操作。這讓CPU 同時也有工作可做,且不用強制應用等待數據的移動。隨后,當確實需要數據時,數據就已經就位了。應用應當進行檢查,以確認操作成功,這將要求檢查寄存器。如果操作提前完成,這將對寄存器進行一次查詢,但不會產生大量工作,占用寶貴的處理時間。

        DMA 的常見用法是將數據移入或移出芯片。CPU 訪問片上存儲器的速度大大快于其訪問片外或外部存儲器的速度。將盡可能多的數據放于芯片上是提高性能的最佳途徑。如果被處理的數據不能全部同時放于芯片上(如大型陣列),那么數據可使用 DMA 成塊地移入或移出芯片。所有數據傳輸都可在后臺進行,同時 CPU 對數據進行實際處理。片上存儲器的智能管理和布局可以減少數據必須移入、移出存儲器的次數。就如何使用片上存儲器開發出智能計劃,在這項工作上投入時間和精力是值得的。總體而言,規則就是使用 DMA 將數據移入、移出片上存儲器并在芯片上生成結果(圖 6)。由于成本和空間原因,大多數 DSP 不具備很多芯片上存儲器。這要求編程人員協調算法,以高效利用現有的片上存儲器。

        為使用 DMA 測量代碼確實會產生一些性能損失。根據應用使用 DMA 的多少,代碼大小會上升。如果全面啟用 DMA,我們曾遇到過代碼大小增長 50% 的情況。使用 DMA 還增加了復雜性和應用的同步化。只有在要求高吞吐量的情況下才應使用 DMA。但是,片上存儲器的智能布局和使用以及明智地使用 DMA 能夠消除大多數訪問片外存儲器所帶來的性能損失。


                                        使用 dma 將數據移入、移出芯片的模板
                                       圖 6. 使用 DMA 將數據移入、移出芯片的模板

        等待狀態與探詢

        就像存儲器和CPU一樣,可將DMA視為資源。在DMA操作進行過程中,應用可以等待DMA傳輸完成,也可以繼續處理應用的另一部分,直到數據傳輸完成為止。每種方法都有其優勢和劣勢。如果應用等待DMA傳輸完成,那么它必須探詢DMA硬件狀態寄存器,直至對比特的設置完成。這要求CPU在循環操作中檢查DMA狀態寄存器,從而導致浪費寶貴的CPU周期。 如果傳輸較短,那么這只需幾個周期就可完成,等等也是值得的。如果數據傳輸較長,應用工程師可能希望使用同步化機制,如在傳輸完成時發出信號標志一樣。在這種情況下,應用會在傳輸發生時通過系統等待信號標志。該應用將與另一個準備運行的應用進行交換。任務交換也會導致開銷,因此如果任務交換產生的開銷大于對DMA完成進行簡單探詢帶來的開銷,那么就不應進行任務交換。等待時間取決于被傳輸數據的數量。

        圖7顯示了檢查傳輸長度并執行DMA探詢操作(如果只需要傳輸幾個字的話)或信號標志等待操作(對較大型數據傳輸而言)的一些代碼。數據大小"平衡"長度取決于處理器以及接口結構,應當建立起原型,以確定最佳大小。

        圖8顯示了等待操作的代碼。在這種情況下,應用將進行SEM_pend操作,以等待DMA傳輸的完成。通過暫時中止當前執行的任務并交換到另一項任務以進行其他處理,可使應用能夠進行其他有意義的工作。當操作系統中止一項任務而開始執行另一項任務時,會導致一定量的開銷。開銷量的大小取決于DSP和操作系統。

        圖9顯示了探詢操作的代碼。在該例中,應用將繼續探詢DMA完成狀態寄存器以獲知操作是否完成。這要求使用CPU來進行探詢操作。這樣做使CPU無法進行其他有意義的工作。如果傳輸足夠短,那么CPU只需在短時間內探尋狀態寄存器,這種方法也就可以更有效。


                       檢查傳輸長度并調用驅動程序功能的代碼片段

               圖7. 檢查傳輸長度并調用驅動程序功能的代碼片段,其將探詢DSP狀態寄存器中的DMA完成位,抑或等待操作系統信號標志。{{分頁}}


        最后決策建立于數據傳輸數量以及CPU探詢必須進行多少周期的基礎上。如果探詢所需時間少于操作系統交換任務并開始執行新任務的開銷,那么這種方法就會更有效。


                               等待 dma 完成信號標志的代碼片段
                                  圖 8. 等待 DMA 完成信號標志的代碼片段 

                            探詢 dma 是否完成的代碼片段
                                              圖9. 探詢 DMA 是否完成的代碼片段

        內存的管理

        DSP 最重要的資源之一就是其本身片上或內部的存儲器。這是大多數計算將發生的地方,因為訪問該存儲器比訪問片外或外部存儲器要快得多。由于許多 DSP 因為決定不可預見性的緣故都不具備數據高速緩沖存儲器,因此軟件設計人員將 DSP 內存看作是一種由程序員管理的高速緩沖存儲器。與程序員不能控制的處理器硬件高速緩沖存儲器數據以提高性能不同,DSP 內部數據存儲器在DSP程序員的完全控制之下。使用 DMA,數據可以在后臺進出內存,基本或完全不受DSP CPU的干預。如果管理正確有效的話,內存會成為非常有價值的資源。

        安排好內存的使用并隨時管理數據進入內存的地點,這是相當重要的??紤]到用于眾多應用的有限內存量,并非所有的程序數據都能在應用執行時間中儲存于內存中。隨著時間的推移,數據將被移至內存中,進行處理,可能會被重新使用,并在不需要時移至外部存儲器中。圖10顯示了內部 DSP 存儲器在應用執行時可能的存儲器映射情況。在應用執行時,不同的數據結構將移至片上存儲器中,并最終移出芯片保存到外部存儲器中,或在不需要時在內存中將其覆蓋。


                 必須由程序員管理的 dsp 內存
                                                      圖10. 必須由程序員管理的 DSP 內存

        結論

        直接存儲器存取 (DMA) 是無需 CPU 干預而訪問存儲器的一種方法。外設用于向內存直接寫入并導出數據,這就減輕了 CPU 的負擔。DMA 只是另一種類型的CPU,其唯一作用就是快速移動數據,優勢則在于 CPU 可以向 DMA 發出一些指令移動數據,隨后就可以再進行原本的工作。程序員應當充分利用 DMA 的功能,特別是對 DSP 系統中常見的、數據強度大的數字處理應用更是如此。DMA能夠大大減輕 CPU 的負擔,并有助于高效管理數據。

        下一次,我們將討論其他一些利用 DSP 器件架構,并使用編譯器調度高效代碼的DSP 優化技術,其也能顯著改善性能。具體的課題將包括軟件流水線和循環展開技術。

        參考書目

        《TMS320C62X 程序員指南》,德州儀器,1997 年;

        《計算機架構,量化的方法》,作者:John L Hennesey 和 David A Patterson , Morgan Kaufmann Publishers 公司1990 年版權所有,Palo Alto, CA。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 独山县| 故城县| 花莲县| 新河县| 文安县| 嘉义市| 福清市| 湖南省| 左云县| 吉水县| 通城县| 长武县| 长岭县| 济南市| 上饶县| 建湖县| 泗阳县| 高平市| 鲁甸县| 祥云县| 隆回县| 镇平县| 如东县| 唐山市| 平定县| 文昌市| 伊春市| 普兰县| 广德县| 阜康市| 古丈县| 图木舒克市| 喀什市| 嘉祥县| 隆德县| 嫩江县| 海阳市| 赤壁市| 资源县| 灵武市| 襄垣县|