在《【解密】C語言程序優(yōu)化工作流程(一)》一文中
創(chuàng)新互聯(lián)為大家介紹了關(guān)于C語言程序優(yōu)化工作的三個階段,且對每個階段進(jìn)行的詳細(xì)的介紹。程序員在進(jìn)行優(yōu)經(jīng)工作時(shí)需要根據(jù)自身的情況來決定需要優(yōu)化到哪個階段。如有不懂之處可及時(shí)的聯(lián)系
創(chuàng)新互聯(lián)的在線客服人員,我們將隨時(shí)為您提升服務(wù)。
接下來
創(chuàng)新互聯(lián)小編要為大家介紹的是C語言程序優(yōu)化工作流程的第二部分內(nèi)容,也就是C語言程序優(yōu)化工作流程的一些注意事項(xiàng),共八個點(diǎn)需要編程人員注意。
C語言程序優(yōu)化工作流程的注意事項(xiàng)1)選用C編譯器提供的優(yōu)化選項(xiàng)在編譯器中提供了分為若干等級和種類的自動優(yōu)化選項(xiàng),如下:
● -o:使能軟件流水和其他優(yōu)化方法
● -pm:使能程序級優(yōu)化
● -mt:使能編譯器假設(shè)程序中沒有數(shù)據(jù)存儲混淆,可進(jìn)一步優(yōu)化代碼。
● -mg:使能分析(profile)優(yōu)化代碼
● -ms:確保不產(chǎn)生冗余循環(huán),從而減小代碼尺寸● -mh:允許投機(jī)執(zhí)行● -mx:使能軟件流水循環(huán)重試,基于循環(huán)次數(shù)對循環(huán)試用多個方案,以便選擇好方案。
程序員在C語言程序優(yōu)化工作中應(yīng)根據(jù)實(shí)際編譯的程序,選擇合適的優(yōu)化選項(xiàng),進(jìn)行源程序的優(yōu)化。
2)減小存儲器相關(guān)性為使指令達(dá)到大效率,C64X編譯器盡可能將指令安排為并行執(zhí)行。為使指令并行操作,編譯器必須知道指令間的關(guān)系,因?yàn)橹挥胁幌嚓P(guān)的指令才可以并行執(zhí)行。當(dāng)編譯器不能確定兩條指令是否相關(guān)時(shí),則編譯器假定它們是相關(guān)的,從而不能并行執(zhí)行。
設(shè)計(jì)中常采用關(guān)鍵字const來指定目標(biāo),const表示一個變量或一個變量的存儲單元保持不變。因此,在代碼中加入關(guān)鍵字const,可以去除指令間的相關(guān)性。例如下面的程序:
void vecsum(short *sum,short*in1,short*in2,unsigned int N){int i;
for(i=0;i
由于使用了關(guān)鍵字const,消除了指令之間的相關(guān)路徑,從而使編譯器能夠判別內(nèi)存操作之間的相關(guān)性,找到更好的指令執(zhí)行方案。
3)使用內(nèi)聯(lián)函數(shù)(intrinsics)內(nèi)聯(lián)函數(shù)是C64X編譯器提供的專門函數(shù),它們與嵌入式的匯編指令是一一對應(yīng)的,其目的是快速優(yōu)化C源程序。在源程序中調(diào)用內(nèi)聯(lián)函數(shù),與調(diào)用一般的函數(shù)相同,只不過內(nèi)聯(lián)函數(shù)名稱前有下劃線作特殊標(biāo)識。
當(dāng)匯編指令功能不易采用C語言表達(dá)時(shí),可采用內(nèi)聯(lián)函數(shù)表示。例如在定點(diǎn)運(yùn)算中經(jīng)常要求出源操作數(shù)的冗余符號位數(shù),這一功能如果用C完成的話,需要如下的代碼:
unsigned int norm(int src1)
{
unsigned int sign, result = 0;
sign = src1 & 0x80000000;
while(1)
{
f(sign)
{
if((src1 = src1
4)short型數(shù)據(jù)的int處理C64XDSP具有雙16bit擴(kuò)充功能,芯片能在一個周期內(nèi)完成雙16bit的乘法、加減法、比較、移位等操作。在設(shè)計(jì)時(shí),當(dāng)對連續(xù)的short型數(shù)據(jù)流操作時(shí),應(yīng)該轉(zhuǎn)化成對int型數(shù)據(jù)流的操作。
這樣一次就可以把兩個16位的數(shù)據(jù)讀入一個32位的寄存器,然后用內(nèi)部函數(shù)來對它們處理(如_sub2等),充分運(yùn)用雙16bit擴(kuò)充功能,一次可以進(jìn)行兩個16bit數(shù)據(jù)的運(yùn)算,速度將提升一倍。
5)盡量少進(jìn)行函數(shù)調(diào)用函數(shù)調(diào)用的時(shí)候,要將PC和一些寄存器壓棧保存,函數(shù)返回時(shí),則將這些寄存器出棧返回,增加了一些不必要的操作。所以一些小的函數(shù),最好是用適當(dāng)?shù)膬?nèi)聯(lián)函數(shù)代替直接寫入主函數(shù)里,一些調(diào)用不多的函數(shù),也可以直接寫入主函數(shù)內(nèi)。
這樣可以減少不必要的操作,提高速度。但是這樣往往會增加程序的長度,因此它是一種利用空間換取時(shí)間的辦法。
6)盡量使用邏輯運(yùn)算代替乘除運(yùn)算在DSP里,乘除運(yùn)算指令的執(zhí)行時(shí)間要遠(yuǎn)遠(yuǎn)超過邏輯移位指令,尤其是除法指令,在設(shè)計(jì)的時(shí)候,可以根據(jù)實(shí)際情況,進(jìn)行一些調(diào)整,盡量用邏輯移位運(yùn)算來代替乘除運(yùn)算,這樣可以加快指令的運(yùn)行時(shí)間。
7)軟件流水線技術(shù)的使用軟件流水線技術(shù)主要是用來對一個循環(huán)結(jié)構(gòu)的指令進(jìn)行調(diào)度安排,使之成為多重迭代循環(huán)并行執(zhí)行。在編譯代碼時(shí),可以選擇編譯器的-o2或-o3選項(xiàng),那么編譯器將根據(jù)程序盡可能地安排軟件流水線。
在DSP算法中存在大量的循環(huán)操作,因此充分地運(yùn)用軟件流水線方式,能極大地提高程序的運(yùn)行速度。但使用軟件流水線還有下面幾點(diǎn)限制:
● 循環(huán)結(jié)構(gòu)不能包含代碼調(diào)用,但可以包含內(nèi)聯(lián)函數(shù)。
● 循環(huán)計(jì)數(shù)器應(yīng)該是遞減的。
● 循環(huán)結(jié)構(gòu)不能包含break,if語句不能嵌套,條件代碼應(yīng)當(dāng)盡量的簡單。
● 循環(huán)結(jié)構(gòu)中不要包含改變循環(huán)計(jì)數(shù)器的代碼。
● 循環(huán)體代碼不能過長,因?yàn)榧拇嫫鳎?2個)的數(shù)量有限,應(yīng)該分解為多個循環(huán)。
在軟件流水線的運(yùn)用上,應(yīng)該盡量使復(fù)雜的循環(huán)分解成簡單的小循環(huán),以避免寄存器的數(shù)量不夠;對于過于簡單的循環(huán),應(yīng)該適當(dāng)?shù)恼归_,以增加代碼數(shù)量和增加流水線中的迭代指令。
8)采用指令亂序技術(shù)C語言程序中,有些指令的執(zhí)行順序沒有嚴(yán)格的要求,程序員可以作出一些位置上的調(diào)整,因此可以適當(dāng)?shù)恼{(diào)整這些指令的位置,穿插于其他的指令之中,從而減小指令的相關(guān)性,增加運(yùn)行時(shí)的并行性。
尤其在循環(huán)里,當(dāng)循環(huán)體較小的時(shí)候,可以把多個循環(huán)的代碼寫在一個循環(huán)體里,合并成一個循環(huán),從而減小循環(huán)內(nèi)指令的相關(guān)性,增加指令運(yùn)行的并行性。但是要注意不要使循環(huán)過于復(fù)雜,否則很可能會導(dǎo)致不能進(jìn)行軟件流水線的優(yōu)化。
網(wǎng)頁名稱:C語言程序優(yōu)化工作流程的注意事項(xiàng)
轉(zhuǎn)載注明:http://jinyejixie.com/news9/140309.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、全網(wǎng)營銷推廣、移動網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、用戶體驗(yàn)、建站公司
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)