David Katz, Tomasz Lukasiak, 和 Rick Gentile
隨著“開源”C/C++算法在嵌入式處理應用中越來越流行地替代基于版稅的代碼,它們帶來了新的技術挑戰。其中最重要的是如何優化獲取的代碼以在所選處理器上正常工作。這個問題至關重要,因為為給定處理器系列編寫的編譯器將利用該處理器的優勢,但代價可能是其他領域的低效率。當同一算法直接在不同的平臺上開箱即用時運行時,性能可能會降低。本文將探討如何將此類開源算法移植到ADI公司黑鰭金槍魚處理器?,在此過程中概述了導致代碼優化的“攻擊計劃”。
什么是開源?
“開源”的普遍理解定義是指任何帶有源代碼的項目,可供其他程序員使用。開源軟件通常是在軟件程序員社區內協作開發的,并自由分發。例如,Linux操作系統就是以這種方式開發的。如果一切順利,由此產生的工作將提供一個不斷發展的、經過充分測試的健壯應用程序,因為許多不同的應用程序都利用了代碼。鼓勵程序員使用代碼,因為他們不必付費或自己開發代碼,從而加快了他們的項目進度。他們成功使用代碼提供了進一步的測試信息。
“開源”的認證印章歸開源促進會(OSI)所有。如果分發條款符合 OSI 的開源定義,則為自由共享和改進而開發的代碼可以使用開源商標。這要求根據某些準則將軟件重新分發給其他人。例如,在通用公共許可證(GPL)下,必須提供源代碼,以便其他開發人員能夠改進或發展它。
什么是奧格?
有一個完整的開發人員社區,他們致力于為數字媒體創建開放標準和應用程序的事業。其中一個團體是 Xiph.Org 基金會,這是一家非營利性公司,其目的是支持和開發免費、開放的協議和軟件,為公眾、開發者和商業市場服務。這個傘式組織負責監督視頻(Theora)、音樂(有損Vorbis和無損Flac)和語音(Speex)編解碼器等技術的管理。
術語 Ogg 表示保存多媒體數據的容器格式。它通常用作生成數據的特定編解碼器的前綴。Vorbis,我們將在這里討論的一種音頻編解碼器,它使用Ogg將其比特流存儲為文件,因此通常稱為“Ogg Vorbis”。事實上,一些便攜式媒體播放器被宣傳為支持 OGG 文件,其中“Vorbis”部分是隱含的。Speex是下面討論的語音編解碼器,它也使用Ogg格式將其比特流作為文件存儲在計算機上。但是,互聯網協議語音(VoIP)和其他實時通信系統不需要文件存儲功能,并且使用實時傳輸協議(RTP)等網絡層來封裝這些流。因此,即使是 Vorbis 在通過多播分發服務器通過網絡傳輸時也會丟失其 Ogg shell。
什么是沃比斯?
Vorbis 是一種完全開放、無專利、免版稅的音頻壓縮格式。在許多方面,它在功能上與無處不在的MPEG-1 / 2第3層(MP3)格式和較新的MPEG-4(AAC)格式非常相似。該編解碼器專為中到高質量(8 kHz 至 48 kHz 帶寬,>16 位,復音)音頻而設計,比特率為 16 至 128 kbps/通道,因此它是音樂的理想格式。
最初的 Vorbis 實現是使用浮點算法開發的,主要是因為編程簡單,導致發布速度更快。由于大多數電池供電的嵌入式系統(如便攜式MP3播放器)使用更便宜,電池效率更高的定點處理器,因此開源開發人員社區創建了Vorbis解碼器的定點實現。這個定點Vorbis解碼器的源代碼被稱為Tremor,是在允許將其合并到開源和商業系統中的許可證下發布的。
在選擇用于移植 Vorbis 解碼器的特定定點架構之前,分析從壓縮比特流恢復音頻所涉及的處理類型非常重要。Vorbis 解碼過程(和其他類似算法)的通用處理器流程如圖 2 所示。像許多其他解碼算法一樣,有兩個主要階段:前端和后端。
圖2.Vorbis 解碼過程的通用處理器流。
在前端階段,主要活動是標頭和數據包解包、表查找和霍夫曼解碼。這類操作涉及大量的條件代碼和相對較大的程序空間,因此嵌入式開發人員通常使用微控制器作為前端。
后端處理由篩選函數、逆變換和常規向量運算定義。與前端階段相比,后端階段涉及更多的循環構造和內存訪問,通常使用較少的代碼。由于這些原因,嵌入式系統中的后端處理歷來由成熟的DSP主導。
Blackfin處理器架構統一了微控制器(MCU)和DSP功能,因此不再需要兩個獨立的設備。它可以有效地用于在單個芯片上實現前端和后端處理。
什么是斯皮克斯?
Speex 是一種開源、無專利的音頻壓縮格式,專為語音而設計。雖然Vorbis用于壓縮所有類型的音樂和音頻,但Speex僅針對語音。出于這個原因,Speex在相同質量水平的語音上可以比Vorbis取得更好的結果。
正如Vorbis與MP3和AAC等基于版稅的算法競爭一樣,Speex與GSM-EFR和G.72x算法(如G.729和G.722)共享語音編解碼器市場的空間。Speex還具有大多數其他編解碼器中不存在的許多功能。其中包括可變比特率 (VBR)、在同一比特流(8 kHz、16 kHz 和 32 kHz)中集成多個采樣率以及立體聲編碼支持。此外,Speex最初的設計目標是促進與互聯網應用程序的整合,因此它是VoIP電話系統中非常強大的組件。
除了其獨特的技術特性外,Speex還具有“無成本”的主要優勢,并且可以分發和修改以符合特定的應用。源代碼在類似于Vorbis的許可證下分發。由于項目的維護者意識到將 Speex 嵌入到小型定點處理器中的重要性,因此在主代碼分支中合并了定點實現。
優化黑鰭金槍魚處理器上的 Vorbis 和 Speex
當現有應用程序(如 Vorbis 或 Speex)移植到新處理器時,即時的“開箱即用”代碼性能是最重要的考慮因素。但是,軟件工程師可以通過熟悉可用于優化整體性能的許多技術來獲得豐厚的回報。有些只需要最少的額外努力。
將任何軟件移植到像Blackfin這樣的嵌入式處理器的第一步是定制低級I / O例程以滿足系統需求。例如,Vorbis 和 Speex 的參考代碼都假設數據源自文件,并且處理后的輸出存儲到文件中(主要是因為這兩種實現最初都是為在 Unix/Linux 系統上運行的,其中文件I/O 例程可用)。然而,在嵌入式媒體系統中,輸入和/或輸出通常連接到在數字和現實世界模擬域之間進行轉換的A/D和D/A數據轉換器。圖 3 顯示了可能的基于 Vorbis 的媒體播放器實現的概念概述。輸入比特流從閃存傳輸,解碼器輸出驅動音頻DAC。此外,雖然某些媒體應用程序(例如便攜式音樂播放器)仍然使用文件來存儲數據,但許多系統用網絡連接取代了存儲。
圖3.示例:Vorbis 媒體播放器實現。
在優化像 Vorbis 解碼器這樣的系統以高效運行時,最好有一個有組織的攻擊計劃。一種可能性是首先從 C 中優化算法,然后簡化系統數據流,最后在匯編級別調整各個代碼片段。圖 4 說明了通過連續優化步驟減少處理器負載的代表性,并顯示了此方法的效率。
圖4.在Blackfin上優化Vorbis源代碼的步驟,導致處理器利用率顯著降低。
編譯器優化
代碼優化最有用的工具可能是好的探查器。使用 Blackfin 的 VisualDSP++ 中的統計分析器,程序員可以快速關注處理器執行代碼時變得明顯的熱點。在許多實現中,20% 的代碼占用了 80% 的處理時間。專注于這些關鍵部分會產生最高的邊際回報。事實證明,循環是像 Vorbis 這樣的媒體算法中優化的主要候選者,因為密集的數字處理通常發生在它們內部。
還有全局代碼優化方法。首先,編譯器可以針對內存節省或速度進行優化。此外,還可以考慮將匯編指令自動內聯到 C 代碼中的函數。(編譯器的 inline 關鍵字用于指示函數應在調用點內聯生成代碼。這樣做可以避免各種成本,例如程序流延遲、函數進入和退出指令以及參數傳遞開銷。這也在空間和速度之間產生了權衡。最后,像Blackfin這樣的編譯器可以使用兩階段過程來派生單個項目中各種源文件之間的關系,以進一步加快代碼執行(過程間分析)。
如上所述,大多數媒體算法參考軟件都使用浮點運算。但是,使用分數定點機編寫的軟件仍然錯過了一個關鍵部分。大多數編解碼器算法選擇的語言是 C,但 C 語言并不“原生”支持使用分數定點數據。因此,許多分數定點算法都使用整數數學進行仿真。這可能會使代碼具有高度的可移植性,但它無法達到通過使用特定于機器的編譯器構造重寫某些數學函數以實現最高計算效率來實現的性能。
圖 5 顯示了說明這一點的具體示例。左列顯示了適用于所有整數機器的模擬小數算術的 C 代碼和 Blackfin 編譯器輸出。一次調用來執行 32 位小數乘法需要 80 個周期。右列顯示了利用 (mult_fr1x32x32) 獲得的性能改進,( 是 Blackfin 編譯器的固有功能,它利用了底層小數硬件。通過這種相當簡單的修改,實現了 86% 的加速。
圖5.編譯器內部函數是一個重要的優化工具。
系統優化
系統優化始于適當的內存布局。在最好的情況下,所有代碼和數據都可以放入處理器的L1內存中。遺憾的是,這并不總是可行的,尤其是在網絡應用程序中實現基于 C 的大型應用程序時。
真正的困境是處理器經過優化,可以通過直接內存訪問(DMA)獨立于內核移動數據,但MCU程序員通常使用緩存模型運行。雖然核心提取是不可避免的現實,但必須使用 DMA 或緩存進行大型傳輸以保持性能。
為了介紹討論,讓我們考慮Blackfin總線架構固有支持的幾個屬性。首先是無需核心干預即可仲裁請求的能力。由于內部存儲器通常構建在子庫中,因此通過將數據放置在單獨的組中,可以在單個周期內完成DMA控制器和內核的同時訪問。例如,內核可以對一個子銀行中的數據進行操作,而DMA正在填充第二個子銀行中的新緩沖區。在某些情況下,也可以同時訪問同一子銀行。
通常只有一條物理總線可用于訪問外部存儲器。因此,仲裁功能變得更加重要。這里有一個例子來闡明這一挑戰:在任何給定的周期中,可以訪問外部存儲器位置以填充指令緩存,同時它充當傳入和傳出數據的源和目的地。
指令執行
Blackfin處理器使用分層內存架構,努力平衡具有不同大小和性能水平的多個內存級別。片上 L1 存儲器最接近核心處理器,以全時鐘速率運行。此存儲器可以配置為SRAM和/或緩存。需要最高確定性的應用可以在單個內核時鐘周期內訪問片內SRAM。對于需要更大代碼大小的系統,可以使用額外的片上和片外存儲器,但延遲會增加。
SDRAM比L1 SRAM慢,但它是存儲大型程序和數據緩沖區所必需的。但是,程序員有幾種方法可以利用快速 L1 內存。如果目標應用程序直接適合 L1 內存,則除了程序員將應用程序代碼直接映射到此內存空間之外,不需要執行任何特殊操作,如上述 Vorbis 示例所示。
如果應用程序代碼對于內部存儲器來說太大,例如在將網絡組件添加到 Vorbis 編解碼器時,可以使用緩存機制來允許程序員訪問更大、更便宜的外部存儲器。緩存可根據需要自動將代碼導入 L1 內存。一旦進入L1,代碼就可以在單個內核周期內執行,就像它最初存儲在片上一樣。此過程的主要優點是程序員不必管理代碼進出緩存的移動。
當正在執行的代碼本質上是線性的時,最好使用緩存。指令緩存實際上執行兩個角色。首先,它有助于以更有效的方式從外部存儲器預取指令。此外,由于緩存通常使用某種類型的“最近最少使用”算法運行,因此運行次數最多的指令通常保留在緩存中。因此,如果代碼已提取一次并且尚未被替換,則下次通過循環執行它將準備好執行。
謹慎的實時程序員不信任緩存來獲得最佳系統性能,因為如果在需要執行時緩存中沒有指令塊,系統性能就會下降。通過利用緩存鎖定機制可以避免此問題。當關鍵指令加載到緩存中時,可以鎖定緩存行以防止指令被替換。這允許程序員將他們需要的東西保存在緩存中,并允許緩存機制本身管理不太關鍵的指令。此功能使Blackfin處理器與其他信號處理器區分開來。
數據管理
在討論了如何最好地管理代碼以提高此應用程序的性能之后,現在讓我們考慮數據移動的選項。作為緩存的替代方法,可以使用獨立于內核的 DMA 控制器將數據移入和移出 L1 內存。當內核在內存的一部分上運行時,DMA 將引入下一個要處理的數據緩沖區。
Blackfin數據存儲器架構對整體系統性能的重要性不亞于指令時鐘速度。由于多媒體應用中通常同時發生多個數據傳輸,因此總線結構必須支持對內部和外部存儲器所有區域的內核和DMA訪問。自動處理 DMA 控制器和內核的仲裁至關重要,否則性能將大大降低。內核到 DMA 交互只需在設置 DMA 控制器時進行,稍后在準備好處理數據時響應中斷。此外,數據緩存還可以提高整體性能。
在默認模式下,Blackfin將數據獲取作為基本的核心功能執行。雖然這通常是傳輸數據的效率最低的機制,但它導致了最簡單的編程模型。快速暫存器存儲器通常作為 L1 存儲器的一部分提供;但對于較大的片外緩沖區,如果內核必須獲取所有內容,則訪問時間將受到影響。不僅需要多個周期來獲取數據,而且核心也將忙于獲取。
因此,只要有可能,DMA 應始終用于移動數據。Blackfin處理器具有DMA功能,可在外設和內存之間以及不同內存段之間傳輸數據。例如,我們的 Vorbis 實現使用 DMA 將音頻緩沖區傳輸到音頻 D/A 轉換器。
對于此音頻應用,使用“旋轉門”雙緩沖方案來容納 DMA 引擎。當循環雙緩沖器的一半被串行端口DMA清空時,另一半被解碼的音頻數據填充。為了限制壓縮數據的解碼速率,DMA 中斷服務例程 (ISR) 修改解碼器可以讀取的信號量,以確保寫入雙緩沖區的特定一半是安全的。在缺少操作系統 (OS) 的設計中,輪詢信號量意味著浪費 CPU 周期;但是,在操作系統下,調度程序可以切換到另一個任務(如用戶界面),以使處理器忙于實際工作。
如果不考慮數據一致性,使用 DMA 可能會導致不正確的結果。因此,與音頻 DAC 關聯的音頻緩沖區放置在不可緩存的內存空間中,因為緩存可能保存的數據版本比 DMA 要傳輸的緩沖區更新。
裝配優化
優化的最后階段與用匯編語言重寫開源 C 代碼的隔離段有關。通過程序集重寫提高性能的最佳候選者通常是中斷服務例程 (ISR) 和可重用的信號處理模塊。
在匯編中編寫中斷處理程序的動力是,低效的 ISR 會減慢其他中斷處理程序的響應速度。例如,某些音頻設計必須使用音頻 ISR 來格式化綁定到音頻 DAC 的 AC97 數據。由于這種情況會定期發生,因此較長的音頻 ISR 可能會減慢其他事件的響應速度。減少中斷處理程序的周期計數的最佳方法是在匯編中重寫它。
可重用信號處理模塊的一個很好的例子是后端Vorbis處理中使用的改進的離散余弦變換(MDCT),用于將時域信號轉換為頻域表示。編譯器永遠無法像熟練的匯編程序員那樣生成“緊湊”的代碼,因此 MDCT 的 C 版本效率低下。同一函數的匯編版本可以利用Blackfin架構的硬件功能,例如單周期蝶形加減法和硬件位反轉。
今天,Vorbis和Speex的Blackfin端口都存在,并可根據要求提供。這些端口在ADSP-BF533 EZ-KIT Lite上運行。μClinux的開源端口也可在 blackfin.uclinux.org 獲得??傊鼈冎С指鞣N應用程序,這些應用程序尋求集成免版稅的語音或音樂功能,同時為其他特性和功能保留充足的處理空間。例如,新型ADSP-BF536和ADSP-BF537集成以太網MAC,為低成本網絡音頻和語音應用打開了大門。顯然,開源代碼預示著嵌入式處理世界的一場革命,Blackfin處理器準備充分利用這種情況。
審核編輯:郭婷
-
處理器
+關注
關注
68文章
19453瀏覽量
231361 -
嵌入式
+關注
關注
5096文章
19199瀏覽量
308166
發布評論請先 登錄
相關推薦
香山是什么?“香山” 高性能開源 RISC-V 處理器項目介紹
在Cortex-M55處理器上進行IP選擇和軟件開發示例分享
遠程網絡處理器應用程序和與自定義應用程序的詳細資料免費下載
![遠程網絡<b class='flag-5'>處理器</b><b class='flag-5'>應用程序</b>和與自定義<b class='flag-5'>應用程序</b>的詳細資料免費下載](https://file.elecfans.com/web1/M00/59/0A/pIYBAFthfxCAFqa0AABL120_p7E277.png)
如何提高開源嵌入式處理應用程序的性能
![如何提高<b class='flag-5'>開源</b>嵌入式<b class='flag-5'>處理應用程序</b>的<b class='flag-5'>性能</b>](https://file.elecfans.com/web1/M00/8D/85/pIYBAFyiQpGAX0b2AAAWfyj3sMQ237.gif)
用于移動應用程序的多媒體處理器 EMMA Mobile1for UART 接口
![用于移動<b class='flag-5'>應用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for UART 接口](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應用程序的多媒體處理器 EMMA Mobile1for Image Composer
![用于移動<b class='flag-5'>應用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for Image Composer](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應用程序的多媒體處理器 EMMA Mobile1for MICROWIRE
![用于移動<b class='flag-5'>應用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for MICROWIRE](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于移動應用程序的多媒體處理器 EMMA Mobile1for Camera Interface
![用于移動<b class='flag-5'>應用程序</b>的多媒體<b class='flag-5'>處理器</b> EMMA Mobile1for Camera Interface](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論