David Katz, Tomasz Lukasiak, 和 Rick Gentile
隨著“開源”C/C++算法在嵌入式處理應用中越來越流行地替代基于版稅的代碼,它們帶來了新的技術挑戰(zhàn)。其中最重要的是如何優(yōu)化獲取的代碼以在所選處理器上正常工作。這個問題至關重要,因為為給定處理器系列編寫的編譯器將利用該處理器的優(yōu)勢,但代價可能是其他領域的低效率。當同一算法直接在不同的平臺上開箱即用時運行時,性能可能會降低。本文將探討如何將此類開源算法移植到ADI公司黑鰭金槍魚處理器?,在此過程中概述了導致代碼優(yōu)化的“攻擊計劃”。
什么是開源?
“開源”的普遍理解定義是指任何帶有源代碼的項目,可供其他程序員使用。開源軟件通常是在軟件程序員社區(qū)內協(xié)作開發(fā)的,并自由分發(fā)。例如,Linux操作系統(tǒng)就是以這種方式開發(fā)的。如果一切順利,由此產生的工作將提供一個不斷發(fā)展的、經(jīng)過充分測試的健壯應用程序,因為許多不同的應用程序都利用了代碼。鼓勵程序員使用代碼,因為他們不必付費或自己開發(fā)代碼,從而加快了他們的項目進度。他們成功使用代碼提供了進一步的測試信息。
“開源”的認證印章歸開源促進會(OSI)所有。如果分發(fā)條款符合 OSI 的開源定義,則為自由共享和改進而開發(fā)的代碼可以使用開源商標。這要求根據(jù)某些準則將軟件重新分發(fā)給其他人。例如,在通用公共許可證(GPL)下,必須提供源代碼,以便其他開發(fā)人員能夠改進或發(fā)展它。
什么是奧格?
有一個完整的開發(fā)人員社區(qū),他們致力于為數(shù)字媒體創(chuàng)建開放標準和應用程序的事業(yè)。其中一個團體是 Xiph.Org 基金會,這是一家非營利性公司,其目的是支持和開發(fā)免費、開放的協(xié)議和軟件,為公眾、開發(fā)者和商業(yè)市場服務。這個傘式組織負責監(jiān)督視頻(Theora)、音樂(有損Vorbis和無損Flac)和語音(Speex)編解碼器等技術的管理。
術語 Ogg 表示保存多媒體數(shù)據(jù)的容器格式。它通常用作生成數(shù)據(jù)的特定編解碼器的前綴。Vorbis,我們將在這里討論的一種音頻編解碼器,它使用Ogg將其比特流存儲為文件,因此通常稱為“Ogg Vorbis”。事實上,一些便攜式媒體播放器被宣傳為支持 OGG 文件,其中“Vorbis”部分是隱含的。Speex是下面討論的語音編解碼器,它也使用Ogg格式將其比特流作為文件存儲在計算機上。但是,互聯(lián)網(wǎng)協(xié)議語音(VoIP)和其他實時通信系統(tǒng)不需要文件存儲功能,并且使用實時傳輸協(xié)議(RTP)等網(wǎng)絡層來封裝這些流。因此,即使是 Vorbis 在通過多播分發(fā)服務器通過網(wǎng)絡傳輸時也會丟失其 Ogg shell。
什么是沃比斯?
Vorbis 是一種完全開放、無專利、免版稅的音頻壓縮格式。在許多方面,它在功能上與無處不在的MPEG-1 / 2第3層(MP3)格式和較新的MPEG-4(AAC)格式非常相似。該編解碼器專為中到高質量(8 kHz 至 48 kHz 帶寬,>16 位,復音)音頻而設計,比特率為 16 至 128 kbps/通道,因此它是音樂的理想格式。
最初的 Vorbis 實現(xiàn)是使用浮點算法開發(fā)的,主要是因為編程簡單,導致發(fā)布速度更快。由于大多數(shù)電池供電的嵌入式系統(tǒng)(如便攜式MP3播放器)使用更便宜,電池效率更高的定點處理器,因此開源開發(fā)人員社區(qū)創(chuàng)建了Vorbis解碼器的定點實現(xiàn)。這個定點Vorbis解碼器的源代碼被稱為Tremor,是在允許將其合并到開源和商業(yè)系統(tǒng)中的許可證下發(fā)布的。
在選擇用于移植 Vorbis 解碼器的特定定點架構之前,分析從壓縮比特流恢復音頻所涉及的處理類型非常重要。Vorbis 解碼過程(和其他類似算法)的通用處理器流程如圖 2 所示。像許多其他解碼算法一樣,有兩個主要階段:前端和后端。

圖2.Vorbis 解碼過程的通用處理器流。
在前端階段,主要活動是標頭和數(shù)據(jù)包解包、表查找和霍夫曼解碼。這類操作涉及大量的條件代碼和相對較大的程序空間,因此嵌入式開發(fā)人員通常使用微控制器作為前端。
后端處理由篩選函數(shù)、逆變換和常規(guī)向量運算定義。與前端階段相比,后端階段涉及更多的循環(huán)構造和內存訪問,通常使用較少的代碼。由于這些原因,嵌入式系統(tǒng)中的后端處理歷來由成熟的DSP主導。
Blackfin處理器架構統(tǒng)一了微控制器(MCU)和DSP功能,因此不再需要兩個獨立的設備。它可以有效地用于在單個芯片上實現(xiàn)前端和后端處理。
什么是斯皮克斯?
Speex 是一種開源、無專利的音頻壓縮格式,專為語音而設計。雖然Vorbis用于壓縮所有類型的音樂和音頻,但Speex僅針對語音。出于這個原因,Speex在相同質量水平的語音上可以比Vorbis取得更好的結果。
正如Vorbis與MP3和AAC等基于版稅的算法競爭一樣,Speex與GSM-EFR和G.72x算法(如G.729和G.722)共享語音編解碼器市場的空間。Speex還具有大多數(shù)其他編解碼器中不存在的許多功能。其中包括可變比特率 (VBR)、在同一比特流(8 kHz、16 kHz 和 32 kHz)中集成多個采樣率以及立體聲編碼支持。此外,Speex最初的設計目標是促進與互聯(lián)網(wǎng)應用程序的整合,因此它是VoIP電話系統(tǒng)中非常強大的組件。
除了其獨特的技術特性外,Speex還具有“無成本”的主要優(yōu)勢,并且可以分發(fā)和修改以符合特定的應用。源代碼在類似于Vorbis的許可證下分發(fā)。由于項目的維護者意識到將 Speex 嵌入到小型定點處理器中的重要性,因此在主代碼分支中合并了定點實現(xiàn)。
優(yōu)化黑鰭金槍魚處理器上的 Vorbis 和 Speex
當現(xiàn)有應用程序(如 Vorbis 或 Speex)移植到新處理器時,即時的“開箱即用”代碼性能是最重要的考慮因素。但是,軟件工程師可以通過熟悉可用于優(yōu)化整體性能的許多技術來獲得豐厚的回報。有些只需要最少的額外努力。
將任何軟件移植到像Blackfin這樣的嵌入式處理器的第一步是定制低級I / O例程以滿足系統(tǒng)需求。例如,Vorbis 和 Speex 的參考代碼都假設數(shù)據(jù)源自文件,并且處理后的輸出存儲到文件中(主要是因為這兩種實現(xiàn)最初都是為在 Unix/Linux 系統(tǒng)上運行的,其中文件I/O 例程可用)。然而,在嵌入式媒體系統(tǒng)中,輸入和/或輸出通常連接到在數(shù)字和現(xiàn)實世界模擬域之間進行轉換的A/D和D/A數(shù)據(jù)轉換器。圖 3 顯示了可能的基于 Vorbis 的媒體播放器實現(xiàn)的概念概述。輸入比特流從閃存?zhèn)鬏?,解碼器輸出驅動音頻DAC。此外,雖然某些媒體應用程序(例如便攜式音樂播放器)仍然使用文件來存儲數(shù)據(jù),但許多系統(tǒng)用網(wǎng)絡連接取代了存儲。

圖3.示例:Vorbis 媒體播放器實現(xiàn)。
在優(yōu)化像 Vorbis 解碼器這樣的系統(tǒng)以高效運行時,最好有一個有組織的攻擊計劃。一種可能性是首先從 C 中優(yōu)化算法,然后簡化系統(tǒng)數(shù)據(jù)流,最后在匯編級別調整各個代碼片段。圖 4 說明了通過連續(xù)優(yōu)化步驟減少處理器負載的代表性,并顯示了此方法的效率。

圖4.在Blackfin上優(yōu)化Vorbis源代碼的步驟,導致處理器利用率顯著降低。
編譯器優(yōu)化
代碼優(yōu)化最有用的工具可能是好的探查器。使用 Blackfin 的 VisualDSP++ 中的統(tǒng)計分析器,程序員可以快速關注處理器執(zhí)行代碼時變得明顯的熱點。在許多實現(xiàn)中,20% 的代碼占用了 80% 的處理時間。專注于這些關鍵部分會產生最高的邊際回報。事實證明,循環(huán)是像 Vorbis 這樣的媒體算法中優(yōu)化的主要候選者,因為密集的數(shù)字處理通常發(fā)生在它們內部。
還有全局代碼優(yōu)化方法。首先,編譯器可以針對內存節(jié)省或速度進行優(yōu)化。此外,還可以考慮將匯編指令自動內聯(lián)到 C 代碼中的函數(shù)。(編譯器的 inline 關鍵字用于指示函數(shù)應在調用點內聯(lián)生成代碼。這樣做可以避免各種成本,例如程序流延遲、函數(shù)進入和退出指令以及參數(shù)傳遞開銷。這也在空間和速度之間產生了權衡。最后,像Blackfin這樣的編譯器可以使用兩階段過程來派生單個項目中各種源文件之間的關系,以進一步加快代碼執(zhí)行(過程間分析)。
如上所述,大多數(shù)媒體算法參考軟件都使用浮點運算。但是,使用分數(shù)定點機編寫的軟件仍然錯過了一個關鍵部分。大多數(shù)編解碼器算法選擇的語言是 C,但 C 語言并不“原生”支持使用分數(shù)定點數(shù)據(jù)。因此,許多分數(shù)定點算法都使用整數(shù)數(shù)學進行仿真。這可能會使代碼具有高度的可移植性,但它無法達到通過使用特定于機器的編譯器構造重寫某些數(shù)學函數(shù)以實現(xiàn)最高計算效率來實現(xiàn)的性能。
圖 5 顯示了說明這一點的具體示例。左列顯示了適用于所有整數(shù)機器的模擬小數(shù)算術的 C 代碼和 Blackfin 編譯器輸出。一次調用來執(zhí)行 32 位小數(shù)乘法需要 80 個周期。右列顯示了利用 (mult_fr1x32x32) 獲得的性能改進,( 是 Blackfin 編譯器的固有功能,它利用了底層小數(shù)硬件。通過這種相當簡單的修改,實現(xiàn)了 86% 的加速。

圖5.編譯器內部函數(shù)是一個重要的優(yōu)化工具。
系統(tǒng)優(yōu)化
系統(tǒng)優(yōu)化始于適當?shù)膬却娌季?。在最好的情況下,所有代碼和數(shù)據(jù)都可以放入處理器的L1內存中。遺憾的是,這并不總是可行的,尤其是在網(wǎng)絡應用程序中實現(xiàn)基于 C 的大型應用程序時。
真正的困境是處理器經(jīng)過優(yōu)化,可以通過直接內存訪問(DMA)獨立于內核移動數(shù)據(jù),但MCU程序員通常使用緩存模型運行。雖然核心提取是不可避免的現(xiàn)實,但必須使用 DMA 或緩存進行大型傳輸以保持性能。
為了介紹討論,讓我們考慮Blackfin總線架構固有支持的幾個屬性。首先是無需核心干預即可仲裁請求的能力。由于內部存儲器通常構建在子庫中,因此通過將數(shù)據(jù)放置在單獨的組中,可以在單個周期內完成DMA控制器和內核的同時訪問。例如,內核可以對一個子銀行中的數(shù)據(jù)進行操作,而DMA正在填充第二個子銀行中的新緩沖區(qū)。在某些情況下,也可以同時訪問同一子銀行。
通常只有一條物理總線可用于訪問外部存儲器。因此,仲裁功能變得更加重要。這里有一個例子來闡明這一挑戰(zhàn):在任何給定的周期中,可以訪問外部存儲器位置以填充指令緩存,同時它充當傳入和傳出數(shù)據(jù)的源和目的地。
指令執(zhí)行
Blackfin處理器使用分層內存架構,努力平衡具有不同大小和性能水平的多個內存級別。片上 L1 存儲器最接近核心處理器,以全時鐘速率運行。此存儲器可以配置為SRAM和/或緩存。需要最高確定性的應用可以在單個內核時鐘周期內訪問片內SRAM。對于需要更大代碼大小的系統(tǒng),可以使用額外的片上和片外存儲器,但延遲會增加。
SDRAM比L1 SRAM慢,但它是存儲大型程序和數(shù)據(jù)緩沖區(qū)所必需的。但是,程序員有幾種方法可以利用快速 L1 內存。如果目標應用程序直接適合 L1 內存,則除了程序員將應用程序代碼直接映射到此內存空間之外,不需要執(zhí)行任何特殊操作,如上述 Vorbis 示例所示。
如果應用程序代碼對于內部存儲器來說太大,例如在將網(wǎng)絡組件添加到 Vorbis 編解碼器時,可以使用緩存機制來允許程序員訪問更大、更便宜的外部存儲器。緩存可根據(jù)需要自動將代碼導入 L1 內存。一旦進入L1,代碼就可以在單個內核周期內執(zhí)行,就像它最初存儲在片上一樣。此過程的主要優(yōu)點是程序員不必管理代碼進出緩存的移動。
當正在執(zhí)行的代碼本質上是線性的時,最好使用緩存。指令緩存實際上執(zhí)行兩個角色。首先,它有助于以更有效的方式從外部存儲器預取指令。此外,由于緩存通常使用某種類型的“最近最少使用”算法運行,因此運行次數(shù)最多的指令通常保留在緩存中。因此,如果代碼已提取一次并且尚未被替換,則下次通過循環(huán)執(zhí)行它將準備好執(zhí)行。
謹慎的實時程序員不信任緩存來獲得最佳系統(tǒng)性能,因為如果在需要執(zhí)行時緩存中沒有指令塊,系統(tǒng)性能就會下降。通過利用緩存鎖定機制可以避免此問題。當關鍵指令加載到緩存中時,可以鎖定緩存行以防止指令被替換。這允許程序員將他們需要的東西保存在緩存中,并允許緩存機制本身管理不太關鍵的指令。此功能使Blackfin處理器與其他信號處理器區(qū)分開來。
數(shù)據(jù)管理
在討論了如何最好地管理代碼以提高此應用程序的性能之后,現(xiàn)在讓我們考慮數(shù)據(jù)移動的選項。作為緩存的替代方法,可以使用獨立于內核的 DMA 控制器將數(shù)據(jù)移入和移出 L1 內存。當內核在內存的一部分上運行時,DMA 將引入下一個要處理的數(shù)據(jù)緩沖區(qū)。
Blackfin數(shù)據(jù)存儲器架構對整體系統(tǒng)性能的重要性不亞于指令時鐘速度。由于多媒體應用中通常同時發(fā)生多個數(shù)據(jù)傳輸,因此總線結構必須支持對內部和外部存儲器所有區(qū)域的內核和DMA訪問。自動處理 DMA 控制器和內核的仲裁至關重要,否則性能將大大降低。內核到 DMA 交互只需在設置 DMA 控制器時進行,稍后在準備好處理數(shù)據(jù)時響應中斷。此外,數(shù)據(jù)緩存還可以提高整體性能。
在默認模式下,Blackfin將數(shù)據(jù)獲取作為基本的核心功能執(zhí)行。雖然這通常是傳輸數(shù)據(jù)的效率最低的機制,但它導致了最簡單的編程模型。快速暫存器存儲器通常作為 L1 存儲器的一部分提供;但對于較大的片外緩沖區(qū),如果內核必須獲取所有內容,則訪問時間將受到影響。不僅需要多個周期來獲取數(shù)據(jù),而且核心也將忙于獲取。
因此,只要有可能,DMA 應始終用于移動數(shù)據(jù)。Blackfin處理器具有DMA功能,可在外設和內存之間以及不同內存段之間傳輸數(shù)據(jù)。例如,我們的 Vorbis 實現(xiàn)使用 DMA 將音頻緩沖區(qū)傳輸?shù)揭纛l D/A 轉換器。
對于此音頻應用,使用“旋轉門”雙緩沖方案來容納 DMA 引擎。當循環(huán)雙緩沖器的一半被串行端口DMA清空時,另一半被解碼的音頻數(shù)據(jù)填充。為了限制壓縮數(shù)據(jù)的解碼速率,DMA 中斷服務例程 (ISR) 修改解碼器可以讀取的信號量,以確保寫入雙緩沖區(qū)的特定一半是安全的。在缺少操作系統(tǒng) (OS) 的設計中,輪詢信號量意味著浪費 CPU 周期;但是,在操作系統(tǒng)下,調度程序可以切換到另一個任務(如用戶界面),以使處理器忙于實際工作。
如果不考慮數(shù)據(jù)一致性,使用 DMA 可能會導致不正確的結果。因此,與音頻 DAC 關聯(lián)的音頻緩沖區(qū)放置在不可緩存的內存空間中,因為緩存可能保存的數(shù)據(jù)版本比 DMA 要傳輸?shù)木彌_區(qū)更新。
裝配優(yōu)化
優(yōu)化的最后階段與用匯編語言重寫開源 C 代碼的隔離段有關。通過程序集重寫提高性能的最佳候選者通常是中斷服務例程 (ISR) 和可重用的信號處理模塊。
在匯編中編寫中斷處理程序的動力是,低效的 ISR 會減慢其他中斷處理程序的響應速度。例如,某些音頻設計必須使用音頻 ISR 來格式化綁定到音頻 DAC 的 AC97 數(shù)據(jù)。由于這種情況會定期發(fā)生,因此較長的音頻 ISR 可能會減慢其他事件的響應速度。減少中斷處理程序的周期計數(shù)的最佳方法是在匯編中重寫它。
可重用信號處理模塊的一個很好的例子是后端Vorbis處理中使用的改進的離散余弦變換(MDCT),用于將時域信號轉換為頻域表示。編譯器永遠無法像熟練的匯編程序員那樣生成“緊湊”的代碼,因此 MDCT 的 C 版本效率低下。同一函數(shù)的匯編版本可以利用Blackfin架構的硬件功能,例如單周期蝶形加減法和硬件位反轉。
今天,Vorbis和Speex的Blackfin端口都存在,并可根據(jù)要求提供。這些端口在ADSP-BF533 EZ-KIT Lite上運行。μClinux的開源端口也可在 blackfin.uclinux.org 獲得??傊?,它們支持各種應用程序,這些應用程序尋求集成免版稅的語音或音樂功能,同時為其他特性和功能保留充足的處理空間。例如,新型ADSP-BF536和ADSP-BF537集成以太網(wǎng)MAC,為低成本網(wǎng)絡音頻和語音應用打開了大門。顯然,開源代碼預示著嵌入式處理世界的一場革命,Blackfin處理器準備充分利用這種情況。
審核編輯:郭婷
-
處理器
+關注
關注
68文章
20339瀏覽量
255346 -
嵌入式
+關注
關注
5210文章
20680瀏覽量
337374
發(fā)布評論請先 登錄
如何計算處理器在應用程序中執(zhí)行多行所花費的時間?
香山是什么?“香山” 高性能開源 RISC-V 處理器項目介紹
遠程網(wǎng)絡處理器應用程序和與自定義應用程序的詳細資料免費下載
如何提高開源嵌入式處理應用程序的性能
用于移動應用程序的多媒體處理器 EMMA Mobile1for UART 接口
用于移動應用程序的多媒體處理器 EMMA Mobile1for Image Composer
用于移動應用程序的多媒體處理器 EMMA Mobile1 for Timer
用于移動應用程序的多媒體處理器 EMMA Mobile1for MICROWIRE
用于移動應用程序的多媒體處理器 EMMA Mobile1for Camera Interface
用于移動應用程序的多媒體處理器 EMMA Mobile1 for PDMA
增強開源應用程序中的處理器性能
評論