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

遠程網(wǎng)絡(luò)處理器應(yīng)用程序和與自定義應(yīng)用程序的詳細資料免費下載

如何提高開源嵌入式處理應(yīng)用程序的性能

用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1 for SPI

用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for UART 接口

用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for Image Composer

用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1 for Timer

用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for MICROWIRE

用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1for Camera Interface

用于移動應(yīng)用程序的多媒體處理器 EMMA Mobile1 for PDMA

評論