日本人妻久久中文字幕精品,黄色内裤逼里插着的好看,手机在线观看一级午夜片,日韩免费久久人妻一区网站

網(wǎng)絡(luò)消費(fèi)網(wǎng) >  5G > > 正文
如何將匯編語(yǔ)言與C語(yǔ)言整合至DSP
時(shí)間:2021-11-28 10:22:03

本文將討論如何將匯編語(yǔ)言程序代碼整合到C語(yǔ)言中,以最大化性能以及程序設(shè)計(jì)人員生產(chǎn)力,內(nèi)容涵蓋了編譯器慣例(convention)、內(nèi)嵌(inlining)、內(nèi)嵌函數(shù)(intrinsic)、緩存器連結(jié)(register binding)和除錯(cuò)策略。

隨著DSP處理器性能的提升以及編譯器最佳化技術(shù)的進(jìn)步,曾經(jīng)紅極一時(shí)、僅用匯編語(yǔ)言編寫(xiě)DSP應(yīng)用程序的作法已逐漸被淘汰。今天,幾乎每個(gè)DSP應(yīng)用程序都使用C語(yǔ)言程序代碼和匯編程序碼混合的方式。對(duì)于一些性能需求極高的關(guān)鍵功能,DSP工程師會(huì)繼續(xù)使用高度最佳化的匯編程序碼;而一些次要的功能現(xiàn)在也使用C語(yǔ)言編寫(xiě),使程序代碼更容易維護(hù)和移植。對(duì)于C語(yǔ)言和匯編程序碼的結(jié)合,每位DSP工程師都需要掌握特殊的工具和方法。

眾所皆知,匯編語(yǔ)言編碼具有更高的性能優(yōu)勢(shì),而用C語(yǔ)言編碼則較容易且速度也更快。為了解其中原因,以下我們進(jìn)一步比較匯編語(yǔ)言編碼與C語(yǔ)言編碼的優(yōu)缺點(diǎn):

匯編語(yǔ)言編碼的優(yōu)點(diǎn):

?匯編語(yǔ)言編碼可以充分利用處理器的獨(dú)特指令以及各種專(zhuān)門(mén)的硬件資源。而C語(yǔ)言程序代碼是通用型程序代碼,必須支持各種硬件平臺(tái),因此很難支持特殊平臺(tái)程序代碼。

?匯編程序設(shè)計(jì)人員通常對(duì)應(yīng)用程序非常熟悉,可以作出編譯器無(wú)法作出的假設(shè)。

?匯編程序設(shè)計(jì)人員可以發(fā)揮人類(lèi)的創(chuàng)造性;而再先進(jìn)的編譯器也只是一個(gè)自動(dòng)化的程序。

匯編語(yǔ)言編碼的缺點(diǎn):

?匯編程序設(shè)計(jì)人員必須解決耗時(shí)的機(jī)器級(jí)問(wèn)題,如緩存器分配和指令排程。若使用C語(yǔ)言程序代碼,這些問(wèn)題可以由編譯器解決。

?使用匯編語(yǔ)言編碼的程序設(shè)計(jì)人員必須了解DSP架構(gòu)及其指令集的專(zhuān)業(yè)知識(shí);而C語(yǔ)言編碼只需要掌握相當(dāng)普及的C語(yǔ)言知識(shí)。

?若使用匯編語(yǔ)言,將應(yīng)用程序從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)非常困難也相當(dāng)耗時(shí);而C語(yǔ)言應(yīng)用程序的移植相對(duì)而言非常容易。

圖1顯示了如何利用專(zhuān)用硬件機(jī)制來(lái)獲得高度最佳化的匯編程序碼。左邊的C語(yǔ)言編碼利用模塊算法設(shè)計(jì)出一個(gè)循環(huán)緩沖區(qū)P1;右邊高度最佳化的匯編程序碼中,等效的緩沖區(qū)是利用CEVA-TeakLite-III DSP核心的模塊運(yùn)算機(jī)制(Modulo Mechanism)設(shè)計(jì)產(chǎn)生的。只要緩沖區(qū)指標(biāo)(本例中的r0)有更新,模塊運(yùn)算機(jī)制便會(huì)自動(dòng)執(zhí)行模塊運(yùn)算。這種運(yùn)算與指針更新在同一個(gè)周期發(fā)生,因此匯編程序碼比C語(yǔ)言程序代碼更加高效,可為模塊運(yùn)算產(chǎn)生獨(dú)立的指令。

圖1:右邊的CEVA-TeakLite-III匯編程序碼可以建置成左邊的C語(yǔ)言程序代碼。

為DSP應(yīng)用選擇C/匯編程序碼

混合使用的問(wèn)題就在于該如何劃分C語(yǔ)言程序代碼和匯編程序碼的界限,而答案取決于剖析器提供的性能分析結(jié)果。然而在使用剖析器之前,DSP工程師需要為應(yīng)用程序定義清晰的對(duì)象,一些典型的對(duì)象包括循環(huán)數(shù)、程序代碼大小和數(shù)據(jù)大小。一旦這些對(duì)象確定后,所有應(yīng)用程序都應(yīng)該先以C語(yǔ)言編寫(xiě)和制作,隨后使用剖析器來(lái)分析性能。

在一些極端情況下,如控制應(yīng)用,用C語(yǔ)言層級(jí)的編碼就足夠了;但大多數(shù)情況下,原始C語(yǔ)言層級(jí)應(yīng)用程序版本不會(huì)遵從一個(gè)或多個(gè)對(duì)象,這也意味著需要使用一些匯編程序碼來(lái)完成。在求助于匯編語(yǔ)言編碼之前,C語(yǔ)言編碼可提供許多方法來(lái)提高性能,但這些方法不屬于本文討論的范疇。假設(shè)所有C語(yǔ)言級(jí)的方法全用完了,并且準(zhǔn)備使用匯編語(yǔ)言編碼,這時(shí)強(qiáng)烈建議將原始C語(yǔ)言程序代碼保存起來(lái)。這樣不僅方便除錯(cuò),而且一旦條件許可(比如轉(zhuǎn)移到更強(qiáng)大的平臺(tái))還可以回復(fù)原始的C語(yǔ)言。

程序代碼中的匯編語(yǔ)言部份應(yīng)盡可能維持在最少,這樣便能分析從剖析器得到的性能結(jié)果,并定義應(yīng)用程序中的關(guān)鍵函數(shù)。關(guān)鍵函數(shù)會(huì)占用大部份執(zhí)行時(shí)間,必須用匯編語(yǔ)言重寫(xiě)才能滿(mǎn)足性能對(duì)象。當(dāng)兩到三個(gè)最關(guān)鍵的函數(shù)重寫(xiě)后,需要重新進(jìn)行性能測(cè)量,若應(yīng)用程序仍然不能滿(mǎn)足對(duì)象需求,那么必須使用匯編語(yǔ)言定義并重寫(xiě)額外的關(guān)鍵函數(shù),這個(gè)過(guò)程需要不斷地重復(fù)直到滿(mǎn)足性能對(duì)象需求為止。

匯編語(yǔ)言設(shè)計(jì)師的編譯器考慮

在編寫(xiě)會(huì)與C語(yǔ)言程序代碼結(jié)合的匯編程序碼時(shí),匯編程序設(shè)計(jì)人員必須了解編譯器的慣例和假設(shè)。其中有個(gè)重要的編譯器慣例是函數(shù)呼叫慣例,也稱(chēng)為函數(shù)參數(shù)傳遞慣例。這個(gè)慣例描述了編譯器如何在一個(gè)函數(shù)呼叫另一個(gè)函數(shù)時(shí)傳遞參數(shù)。為了使匯編語(yǔ)言函數(shù)能被C語(yǔ)言函數(shù)成功呼叫;反之亦然;匯編語(yǔ)言函數(shù)必須截取參數(shù),然后將參數(shù)發(fā)送到由函數(shù)呼叫慣例定義的硬件資源上,通常為緩存器或堆棧內(nèi)存。

匯編程序設(shè)計(jì)人員還必須了解編譯器的緩存器使用慣例。這些慣例將硬件緩存器分成被呼叫者保存(callee-saved;或呼叫者使用,caller-used);以及被呼叫者使用(callee-used;或呼叫者保存,caller-saved)緩存器。編譯器假設(shè)被呼叫者保存緩存器在函數(shù)呼叫過(guò)程中保持不變的值,若匯編程序設(shè)計(jì)人員希望使用這種緩存器,他們必須先將緩存器的值備份,然后在返回到C語(yǔ)言程序代碼之前恢復(fù)這些緩存器的內(nèi)容;相反的,被呼叫者使用緩存器被認(rèn)為在函式呼叫過(guò)程中不會(huì)保持一定的值。這意味著匯編程序設(shè)計(jì)人員使用這些緩存器之前無(wú)需進(jìn)行備份,不過(guò)他們必須記住,當(dāng)匯編語(yǔ)言函數(shù)呼叫C語(yǔ)言函數(shù)時(shí),被呼叫者可以對(duì)這些緩存器進(jìn)行覆寫(xiě)。

圖2為一個(gè)從CEVA-X1641 DSP核心FFT實(shí)作中截取的匯編程序碼案例。其中以黃色標(biāo)示的add指令遵循CEVA-X1641編譯器的呼叫慣例,在r0地址緩存器中傳遞指針參數(shù)。標(biāo)為藍(lán)色的pushd指令用于備份,隨后函數(shù)會(huì)使用的被呼叫者保存緩存器。

圖2:從CEVA-X1641手寫(xiě)FFT算法匯編語(yǔ)言實(shí)作摘錄的一段程序代碼。

除了呼叫慣例和緩存器使用慣例(針對(duì)每個(gè)編譯器下定義),一些編譯器在人工編寫(xiě)的匯編程序碼方面可能會(huì)有一些額外的假設(shè)。這些假設(shè)通常是針對(duì)編譯器,因此編譯器供貨商應(yīng)該提供完善的數(shù)據(jù)和說(shuō)明。例如,一些DSP架構(gòu)會(huì)有內(nèi)存存取對(duì)齊限制,用于這些DSP的編譯器通常假設(shè)堆棧指針以某個(gè)寬度(如32位)對(duì)齊,這允許編譯器最佳化堆棧的讀寫(xiě)作業(yè),并使用機(jī)器的全部?jī)?nèi)存頻寬;此外亦要求匯編程序設(shè)計(jì)人員在呼叫C語(yǔ)言函數(shù)前確保堆棧對(duì)齊,否則會(huì)發(fā)生對(duì)齊錯(cuò)誤的存取。

編譯器假設(shè)的另外一個(gè)例子與人工編寫(xiě)的匯編程序碼中特殊指令的位置有關(guān)。例如,CEVA-X1641編譯器假設(shè)一個(gè)mov acX, rN指令(將累加器移動(dòng)到地址緩存器)永遠(yuǎn)不會(huì)作為匯編語(yǔ)言函數(shù)的第一條指令。當(dāng)填充呼叫指令(呼叫一個(gè)函數(shù))的延遲槽時(shí),這個(gè)假設(shè)可提供更佳的指令排程。像這樣特殊的假設(shè)通??梢杂脤?zhuān)用編譯功能覆蓋。 連接C/匯編語(yǔ)言的延伸功能

大多數(shù)用于嵌入式平臺(tái)的編譯器,特別是用于DSP程序設(shè)計(jì)上,都具有豐富的C語(yǔ)言和匯編語(yǔ)言連接功能。其中絕大部份功能不屬于標(biāo)準(zhǔn)C語(yǔ)言,因此被稱(chēng)為C語(yǔ)言延伸功能。以下列出的是一些對(duì)DSP程序設(shè)計(jì)更有用的功能。

內(nèi)嵌匯編語(yǔ)言。這個(gè)功能可讓程序設(shè)計(jì)人員將匯編語(yǔ)言指令插入C語(yǔ)言程序代碼,當(dāng)必需使用如裝置驅(qū)動(dòng)程序等低階C語(yǔ)言程序代碼直接存取機(jī)器資源時(shí),會(huì)常使用到該功能。由于在大多數(shù)使用該功能的實(shí)作中,編譯器對(duì)所要插入的指令信息所知有限,因此對(duì)它們的特性會(huì)作出最壞的假設(shè),這種假設(shè)可能會(huì)妨礙許多編譯器最佳化作業(yè)。例如,在支持某些指令(并非全部指令)平行處理的架構(gòu)中,編譯器不會(huì)將插入指令與其它指令作平行處理,因?yàn)檫@種作法很可能會(huì)導(dǎo)致非法指令封包。

將硬件緩存器連結(jié)到C變量。將一個(gè)硬件緩存器連結(jié)到一個(gè)C變量時(shí),C語(yǔ)言程序代碼中的變量值即反映出硬件緩存器的值;反之亦然。每當(dāng)C變量被讀寫(xiě)時(shí),硬件緩存器也相對(duì)地被讀寫(xiě)。這個(gè)功能在低階程序代碼中很常見(jiàn),時(shí)常與匯編語(yǔ)言指令內(nèi)嵌功能結(jié)合在一起,允許內(nèi)嵌匯編程序碼存取C語(yǔ)言層級(jí)的變量。圖3的例子顯示了內(nèi)嵌匯編語(yǔ)言功能(標(biāo)示為橙色)和硬件緩存器連結(jié)功能(標(biāo)示為紫色)的常見(jiàn)組合。

圖3:結(jié)合內(nèi)嵌匯編語(yǔ)言和硬件緩存器連結(jié)的程序代碼片段。

內(nèi)存扇區(qū)屬性。預(yù)設(shè)狀態(tài)下,編譯器將全域C變量和函數(shù)分配到標(biāo)準(zhǔn)的預(yù)定義內(nèi)存扇區(qū),該扇區(qū)屬性允許程序設(shè)計(jì)人員將上述變量和函數(shù)分配到特殊的使用者定義內(nèi)存扇區(qū)。在隨后的連結(jié)階段,這些內(nèi)存扇區(qū)可以被映像到具體的內(nèi)存地址。該功能可讓程序設(shè)計(jì)人員將C語(yǔ)言層級(jí)單元分配到實(shí)際的內(nèi)存位置,這對(duì)DSP應(yīng)用程序來(lái)說(shuō)至關(guān)重要。

使用者定義呼叫慣例。如上所述,編譯器有一個(gè)匯編程序設(shè)計(jì)人員必須遵守的預(yù)定義呼叫慣例;然而在某些情況下,匯編語(yǔ)言函數(shù)可利用不同的呼叫慣例獲得更佳的最佳化效果。例如,編譯器理論上會(huì)在累加器中傳遞參數(shù)。若執(zhí)行延伸地址計(jì)算的函數(shù)能接收地址緩存器中的參數(shù),那么它的效率會(huì)更高。該功能會(huì)依靠附加在函數(shù)原型的專(zhuān)用語(yǔ)法,并通知修正后的呼叫慣例編譯器。

編譯器內(nèi)嵌函數(shù)。意指能夠用專(zhuān)用的宏或函數(shù)呼叫,觸發(fā)內(nèi)建編譯器功能的總稱(chēng)。例如,CEVA-X和CEVA-TeakLite-III編譯器可為語(yǔ)音編碼器中常見(jiàn)的ETSI/ITU基本DSP作業(yè),提供編譯器內(nèi)嵌函數(shù)。針對(duì)這些作業(yè),編譯器可利用其等效高度最佳化匯編語(yǔ)言序列,取代每個(gè)基本作業(yè)。

相反地,沒(méi)有內(nèi)嵌函數(shù)支持的編譯器必須呼叫使用者定義的函數(shù),這樣做會(huì)導(dǎo)致兩大性能缺陷:首先,使用者定義函數(shù)可能會(huì)在一個(gè)回路里產(chǎn)生函數(shù)呼叫和返回(如圖4),因此產(chǎn)生了巨額的開(kāi)銷(xiāo);其次,使用者定義函數(shù)將如同其它C語(yǔ)言程序代碼一樣被編譯,這意味著使用者定義函數(shù)可能會(huì)獲得次要的最佳化性能。而另一方面,具有內(nèi)嵌函數(shù)的編譯器已經(jīng)內(nèi)建了最佳化的實(shí)作。

圖4:H.264編碼器——一個(gè)關(guān)鍵的函數(shù)性能案例。

圖4說(shuō)明了這個(gè)功能的重要性。在圖4中,左邊的C語(yǔ)言程序代碼使用ETSI的mult_r(循環(huán)相乘)基本作業(yè),CEVA-TeakLite-III編譯器產(chǎn)成了如右邊的高效實(shí)作結(jié)果。mult_r作業(yè)在左邊的C語(yǔ)言程序代碼和右邊的匯編程序碼中以紫色標(biāo)示。

匯編語(yǔ)言?xún)?nèi)嵌函數(shù)。匯編語(yǔ)言?xún)?nèi)嵌函數(shù)是將匯編程序碼內(nèi)嵌到C語(yǔ)言程序代碼的一種先進(jìn)方法,詳細(xì)介紹如下。

匯編語(yǔ)言?xún)?nèi)嵌函數(shù)——將匯編語(yǔ)言指令當(dāng)作C語(yǔ)句一樣編寫(xiě)

上述內(nèi)嵌匯編語(yǔ)言功能具有顯著的缺點(diǎn):

1. 它會(huì)破壞各種編譯器的最佳化作業(yè),由于編譯器不了解內(nèi)嵌程序代碼的內(nèi)容,因此會(huì)使用最壞的假設(shè)。

2. 它可能迫使程序設(shè)計(jì)人員處理低階問(wèn)題,如緩存器分配和指令排程。

匯編語(yǔ)言?xún)?nèi)嵌函數(shù)功能可以幫助程序設(shè)計(jì)人員實(shí)現(xiàn)內(nèi)嵌匯編程序碼,且不會(huì)產(chǎn)生上述缺點(diǎn)。從程序設(shè)計(jì)人員的角度來(lái)看,匯編語(yǔ)言?xún)?nèi)嵌函數(shù)就像是C語(yǔ)言宏或函數(shù),它們會(huì)在呈現(xiàn)一個(gè)單一匯編語(yǔ)言指令時(shí),接收C語(yǔ)言層級(jí)變量并返回C語(yǔ)言輸出結(jié)果。由于涉及該功能的所有程序代碼都在C語(yǔ)言層級(jí),因此程序設(shè)計(jì)人員不必?fù)?dān)心緩存器分配、指令排程和其它低級(jí)語(yǔ)言問(wèn)題。匯編語(yǔ)言?xún)?nèi)嵌函數(shù)不僅不會(huì)妨礙編譯器最佳化作業(yè),還會(huì)參與最佳化過(guò)程,就好像是編譯器固定產(chǎn)生的匯編語(yǔ)言指令一樣,這些特性造就了強(qiáng)大的匯編語(yǔ)言?xún)?nèi)嵌函數(shù)功能。

利用匯編語(yǔ)言?xún)?nèi)嵌函數(shù),程序設(shè)計(jì)人員可以從特殊匯編語(yǔ)言指令中受益,這些指令不太可能從編譯器中產(chǎn)生,且通常是為特定算法量身定做的。在適當(dāng)?shù)奈恢貌捎眠@些指令可以大幅提高性能;例如,CEVA-X1641的bitrev指令就是為FFT等算法定制的。由于編譯器不太可能把一個(gè)程序看作FFT而使用bitrev指令,因此程序設(shè)計(jì)人員只需將bitrev匯編語(yǔ)言?xún)?nèi)嵌函數(shù)嵌入到C語(yǔ)言程序代碼中。 結(jié)合程序設(shè)計(jì)人員對(duì)應(yīng)用程序的專(zhuān)業(yè)知識(shí),匯編語(yǔ)言?xún)?nèi)嵌函數(shù)功能也相繼提升。利用這種專(zhuān)業(yè)知識(shí),程序設(shè)計(jì)人員可將精密的匯編語(yǔ)言序列內(nèi)嵌函數(shù)用在C應(yīng)用程序中的關(guān)鍵性能區(qū)域里。這樣一來(lái),程序設(shè)計(jì)人員便能確保編譯器產(chǎn)生的匯編程序碼效率就如同手動(dòng)編寫(xiě)的程序代碼一樣高。

圖5是使用匯編語(yǔ)言?xún)?nèi)嵌函數(shù)與CEVA-X1641編譯器的例子。左邊的C語(yǔ)言函數(shù)使用st(儲(chǔ)存,以紅色標(biāo)示)和msu(乘法和減法,以紫色標(biāo)示)匯編語(yǔ)言?xún)?nèi)嵌函數(shù)。st內(nèi)嵌函數(shù)參與判斷(標(biāo)示為藍(lán)色)和延遲時(shí)隙填充(標(biāo)示為綠色);msu內(nèi)嵌函數(shù)則參與回路解開(kāi)(標(biāo)示為橙色)和Quad-Mac(標(biāo)示為紫色)。匯編語(yǔ)言?xún)?nèi)嵌函數(shù)還受益于由CEVA-X1641編譯器處理的所有機(jī)械相關(guān)問(wèn)題,如緩存器分配、指令排程和硬件單元分配。

圖5:CEVA-X1641編譯器支持匯編語(yǔ)言?xún)?nèi)嵌函數(shù)的使用。

同時(shí)使用C/匯編語(yǔ)言進(jìn)行除錯(cuò)

匯編程序碼的除錯(cuò)并非一件小事,它需要對(duì)如延遲和內(nèi)存對(duì)齊限制等架構(gòu)和機(jī)械層級(jí)問(wèn)題有深入的了解。單純地結(jié)合C語(yǔ)言程序代碼與匯編程序碼會(huì)使問(wèn)題變得更加棘手,因?yàn)檫@樣一來(lái)程序設(shè)計(jì)人員便得對(duì)C語(yǔ)言程序代碼和匯編程序碼間的連結(jié)進(jìn)行除錯(cuò)。

進(jìn)行混合應(yīng)用程序除錯(cuò)的第一步就是隔離問(wèn)題。假設(shè)匯編程序碼的C語(yǔ)言層級(jí)實(shí)作維持不變,且C語(yǔ)言層級(jí)實(shí)作能正常作業(yè),那么將匯編語(yǔ)言函數(shù)轉(zhuǎn)換成C語(yǔ)言實(shí)作并重新測(cè)試應(yīng)用程序就變得相當(dāng)容易。為了迅速檢測(cè)問(wèn)題,程序設(shè)計(jì)人員可以采用交互作業(yè)程序:每一個(gè)步驟都將一半的可疑函數(shù)轉(zhuǎn)換為相應(yīng)的C語(yǔ)言實(shí)作,這樣一來(lái)程序設(shè)計(jì)人員在進(jìn)行每一步時(shí)都只需測(cè)試前一步中一半的函數(shù)。

一旦有問(wèn)題的匯編語(yǔ)言函數(shù)被確定,就應(yīng)該同時(shí)調(diào)查單獨(dú)匯編語(yǔ)言問(wèn)題和C語(yǔ)言與匯編語(yǔ)言的連接問(wèn)題。單獨(dú)匯編語(yǔ)言問(wèn)題的除錯(cuò)對(duì)匯編程序設(shè)計(jì)人員來(lái)說(shuō)十分簡(jiǎn)單明了,但C語(yǔ)言與匯編語(yǔ)言的連接問(wèn)題就有點(diǎn)麻煩。不同于單獨(dú)的匯編語(yǔ)言問(wèn)題,在查看匯編語(yǔ)言函數(shù)本身時(shí),無(wú)法看見(jiàn)C語(yǔ)言與匯編語(yǔ)言的連接問(wèn)題;為了找出這些問(wèn)題,程序設(shè)計(jì)人員必須檢查編譯器的慣例,例如呼叫慣例和緩存器使用慣例。

程序設(shè)計(jì)人員還必須檢查編譯器假設(shè),例如匯編語(yǔ)言指令的行蹤(重復(fù)前面提到的例子,CEVA-X1641編譯器假設(shè)mov acX, rN指令絕不會(huì)作為匯編語(yǔ)言函數(shù)的第一條指令)。為了節(jié)省除錯(cuò)時(shí)間,程序設(shè)計(jì)人員應(yīng)該在第一次實(shí)作匯編語(yǔ)言函數(shù)時(shí)驗(yàn)證是否所有的編譯器慣例和假設(shè)都有遵循慣例。

H.264視訊編碼器和AMR-NB

本文討論的技術(shù)和方法已被CEVA公司用于各種應(yīng)用程序中,包括視訊編譯碼器、音訊編譯碼器、語(yǔ)音編碼器和裝置驅(qū)動(dòng)器。此外,本文所述的功能無(wú)論用在何種案例,均能顯著地提升性能。

H.264視訊編碼器是一個(gè)很好的研究案例。它在處理能力(通常以MHz衡量)及其它資源方面都有強(qiáng)烈需求,特別是在與音訊編譯碼器等其它類(lèi)型的編譯碼器比較上。

CEVA公司利用其高階CEVA-X16xx DSP核心系列及其MM2000多媒體平臺(tái),提供這種編碼器所需的處理能力。

CEVA公司利用先進(jìn)剖析技術(shù)確定這種編碼器的關(guān)鍵函數(shù),然后對(duì)它進(jìn)行最佳化。編碼器的關(guān)鍵函數(shù)最佳化過(guò)程是逐步完成的。首先,利用如匯編語(yǔ)言?xún)?nèi)嵌函數(shù)這樣的先進(jìn)功能全面地將函數(shù)最佳化成C語(yǔ)言;然后進(jìn)一步將編譯器提供的匯編程序碼最佳化成匯編語(yǔ)言層級(jí)。

圖6顯示出透過(guò)對(duì)這種編碼器關(guān)鍵函數(shù)進(jìn)行最佳化過(guò)程所獲得的性能改善。只有最后一個(gè)最佳化階段涉及到全部匯編程序碼范圍;所有其它階段都基于具有匯編語(yǔ)言?xún)?nèi)嵌函數(shù)的C語(yǔ)言程序代碼。這些匯編語(yǔ)言?xún)?nèi)嵌函數(shù)主要用于SIMD(單指令多數(shù)據(jù))作業(yè),如avg_acW_acX_acZ_4b。這條指令對(duì)8個(gè)輸入字節(jié)執(zhí)行字節(jié)平均,進(jìn)而產(chǎn)生4字節(jié)。這種SIMD作業(yè)對(duì)執(zhí)行大量字節(jié)層級(jí)運(yùn)算的視訊編譯碼器而言相當(dāng)實(shí)用(這也是為何CEVA-X16xx架構(gòu)為字節(jié)層級(jí)的SIMD作業(yè)提供廣泛支持的原因)。

圖6:CEVA-TeakLite-III編譯器內(nèi)建ETSI基本作業(yè)支持。

AMR-NB(自適應(yīng)多碼率——窄頻)是廣泛應(yīng)用在無(wú)線(xiàn)通訊應(yīng)用的語(yǔ)音編譯碼器。CEVA已為其所有DSP核心建置該語(yǔ)音編碼器;但為遵循本文主旨,我們?cè)诖酥挥懻揅EVA-X1620建置。將這種語(yǔ)音編碼器完全建置到匯編語(yǔ)言的情況相當(dāng)常見(jiàn),倘若使用本文提到的各種功能,C語(yǔ)言實(shí)作和CEVA-X1620編譯器可達(dá)到與匯編語(yǔ)言實(shí)作競(jìng)爭(zhēng)的結(jié)果。其中提升CEVA-X1620編譯器性能的關(guān)鍵功能就是支持ETSI內(nèi)嵌函數(shù)的功能。

圖7顯示了整個(gè)AMR-NB應(yīng)用經(jīng)過(guò)最佳化過(guò)程后在MCPS(每秒百萬(wàn)循環(huán))上所獲得的性能改善。只有最后的最佳化階段涉及了全范圍的匯編語(yǔ)言編碼,所有其它階段都基于具有ETSI內(nèi)嵌函數(shù)和匯編語(yǔ)言?xún)?nèi)嵌函數(shù)等的C語(yǔ)言程序代碼。

圖7:對(duì)ARM-NB進(jìn)行各種最佳化方法所獲得的MCPS改善。

總之,H.264編碼器和AMR-NB的案例清楚地顯示了匯編語(yǔ)言實(shí)作的性能優(yōu)勢(shì),但也顯示出純匯編語(yǔ)言實(shí)作并非首選的最佳化方法。利用高質(zhì)量軟件開(kāi)發(fā)工具鏈提供的各種C語(yǔ)言和匯編語(yǔ)言功能,DSP程序設(shè)計(jì)人員不必用匯編語(yǔ)言建置整個(gè)應(yīng)用程序也能達(dá)到令人滿(mǎn)意的性能結(jié)果。正如本文所述,編寫(xiě)C語(yǔ)言和匯編語(yǔ)言混合程序代碼不是一件簡(jiǎn)單的工作;不過(guò),本文討論的各種功能都有助于DSP工程師更輕松地完成這項(xiàng)任務(wù)。

關(guān)鍵詞: C 匯編 DSP

版權(quán)聲明:
    凡注明來(lái)網(wǎng)絡(luò)消費(fèi)網(wǎng)的作品,版權(quán)均屬網(wǎng)絡(luò)消費(fèi)網(wǎng)所有,未經(jīng)授權(quán)不得轉(zhuǎn)載、摘編或利用其它方式使用上述作品。已經(jīng)本網(wǎng)授權(quán)使用作品的,應(yīng)在授權(quán)范圍內(nèi)使用,并注明"來(lái)源:網(wǎng)絡(luò)消費(fèi)網(wǎng)"。違反上述聲明者,本網(wǎng)將追究其相關(guān)法律責(zé)任。
    除來(lái)源署名為網(wǎng)絡(luò)消費(fèi)網(wǎng)稿件外,其他所轉(zhuǎn)載內(nèi)容之原創(chuàng)性、真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考并自行核實(shí)。
熱文

網(wǎng)站首頁(yè) |網(wǎng)站簡(jiǎn)介 | 關(guān)于我們 | 廣告業(yè)務(wù) | 投稿信箱
 

Copyright © 2000-2020 hngelin.com All Rights Reserved.
 

中國(guó)網(wǎng)絡(luò)消費(fèi)網(wǎng) 版權(quán)所有 未經(jīng)書(shū)面授權(quán) 不得復(fù)制或建立鏡像
 

聯(lián)系郵箱:920 891 263@qq.com

備案號(hào):京ICP備2022016840號(hào)-15

營(yíng)業(yè)執(zhí)照公示信息

固始县| 团风县| 深州市| 东港市| 石渠县| 泸西县| 临潭县| 浦县| 启东市| 岳阳县| 屯门区| 上饶县| 合山市| 榆林市| 芷江| 仙居县| 通许县| 邹城市| 永仁县| 荃湾区| 榆社县| 库尔勒市| 潮安县| 石河子市| 高唐县| 玛纳斯县| 吉水县| 潮安县| 长治市| 迭部县| 唐河县| 盘锦市| 远安县| 北安市| 松潘县| 滦平县| 长汀县| 永胜县| 闻喜县| 特克斯县| 巩义市|