接下來分形科技小編要為大家介紹的是C語言程序優化工作流程的第二部分內容,也就是C語言程序優化工作流程的一些注意事項,共八個點需要編程人員注意。
C語言程序優化工作流程的注意事項
1)選用C編譯器提供的優化選項
在編譯器中提供了分為若幹等級和種類的自動優化選項,如下:
● -o:使能軟件流水和其他優化方法
● -pm:使能程序級優化
● -mt:使能編譯器假設程序中沒有數據存儲混淆,可進一步優化代碼。
● -mg:使能分析(profile)優化代碼
● -ms:確保不產生冗餘循環,從而減小代碼尺寸● -mh:允許投機執行● -mx:使能軟件流水循環重試,基於循環次數對循環試用多個方案,以便選擇最佳方案。
程序員在C語言程序優化工作中應根據實際編譯的程序,選擇合適的優化選項,進行源程序的優化。
2)減小存儲器相關性
為使指令達到最大效率,C64Xbianyiqijinkenengjiangzhilinganpaiweibingxingzhixing。weishizhilingbingxingcaozuo,bianyiqibixuzhidaozhilingjiandeguanxi,yinweizhiyoubuxiangguandezhilingcaikeyibingxingzhixing。dangbianyiqibunengquedingliangtiaozhilingshifouxiangguanshi,zebianyiqijiadingtamenshixiangguande,congerbunengbingxingzhixing。
設計中常采用關鍵字const來指定目標,const表示一個變量或一個變量的存儲單元保持不變。因此,在代碼中加入關鍵字const,可以去除指令間的相關性。例如下麵的程序:
void vecsum(short *sum,short*in1,short*in2,unsigned int N){int i;
for(i=0;i
由於使用了關鍵字const,消除了指令之間的相關路徑,從而使編譯器能夠判別內存操作之間的相關性,找到更好的指令執行方案。
3)使用內聯函數(intrinsics)
內聯函數是C64X編譯器提供的專門函數,它們與嵌入式的彙編指令是一一對應的,其目的是快速優化C源程序。在源程序中調用內聯函數,與調用一般的函數相同,隻不過內聯函數名稱前有下劃線作特殊標識。
當彙編指令功能不易采用C語言表達時,可采用內聯函數表示。例如在定點運算中經常要求出源操作數的冗餘符號位數,這一功能如果用C完成的話,需要如下的代碼:
unsigned int norm(int src1)
{
unsigned int sign, result = 0;
sign = src1 & 0x80000000;
while(1)
{
f(sign)
{
if((src1 = src1
4)short型數據的int處理
C64XDSP具有雙16bit擴充功能,芯片能在一個周期內完成雙16bit的乘法、加減法、比較、移位等操作。在設計時,當對連續的short型數據流操作時,應該轉化成對int型數據流的操作。
這樣一次就可以把兩個16位的數據讀入一個32位的寄存器,然後用內部函數來對它們處理(如_sub2等),充分運用雙16bit擴充功能,一次可以進行兩個16bit數據的運算,速度將提升一倍。
5)盡量少進行函數調用
函數調用的時候,要將PC和he一yi些xie寄ji存cun器qi壓ya棧zhan保bao存cun,函han數shu返fan回hui時shi,則ze將jiang這zhe些xie寄ji存cun器qi出chu棧zhan返fan回hui,增zeng加jia了le一yi些xie不bu必bi要yao的de操cao作zuo。所suo以yi一yi些xie小xiao的de函han數shu,最zui好hao是shi用yong適shi當dang的de內nei聯lian函han數shu代dai替ti直zhi接jie寫xie入ru主zhu函han數shu裏li,一yi些xie調tiao用yong不bu多duo的de函han數shu,也ye可ke以yi直zhi接jie寫xie入ru主zhu函han數shu內nei。
這樣可以減少不必要的操作,提高速度。但是這樣往往會增加程序的長度,因此它是一種利用空間換取時間的辦法。
6)盡量使用邏輯運算代替乘除運算
在DSP裏li,乘cheng除chu運yun算suan指zhi令ling的de執zhi行xing時shi間jian要yao遠yuan遠yuan超chao過guo邏luo輯ji移yi位wei指zhi令ling,尤you其qi是shi除chu法fa指zhi令ling,在zai設she計ji的de時shi候hou,可ke以yi根gen據ju實shi際ji情qing況kuang,進jin行xing一yi些xie調tiao整zheng,盡jin量liang用yong邏luo輯ji移yi位wei運yun算suan來lai代dai替ti乘cheng除chu運yun算suan,這zhe樣yang可ke以yi加jia快kuai指zhi令ling的de運yun行xing時shi間jian。
7)軟件流水線技術的使用
軟件流水線技術主要是用來對一個循環結構的指令進行調度安排,使之成為多重迭代循環並行執行。在編譯代碼時,可以選擇編譯器的-o2或-o3選項,那麼編譯器將根據程序盡可能地安排軟件流水線。
在DSP算法中存在大量的循環操作,因此充分地運用軟件流水線方式,能極大地提高程序的運行速度。但使用軟件流水線還有下麵幾點限製:
● 循環結構不能包含代碼調用,但可以包含內聯函數。
● 循環計數器應該是遞減的。
● 循環結構不能包含break,if語句不能嵌套,條件代碼應當盡量的簡單。
● 循環結構中不要包含改變循環計數器的代碼。
● 循環體代碼不能過長,因為寄存器(32個)的數量有限,應該分解為多個循環。
在軟件流水線的運用上,應該盡量使複雜的循環分解成簡單的小循環,以避免寄存器的數量不夠;對於過於簡單的循環,應該適當的展開,以增加代碼數量和增加流水線中的迭代指令。
8)采用指令亂序技術
C語(yu)言(yan)程(cheng)序(xu)中(zhong),有(you)些(xie)指(zhi)令(ling)的(de)執(zhi)行(xing)順(shun)序(xu)沒(mei)有(you)嚴(yan)格(ge)的(de)要(yao)求(qiu),程(cheng)序(xu)員(yuan)可(ke)以(yi)作(zuo)出(chu)一(yi)些(xie)位(wei)置(zhi)上(shang)的(de)調(tiao)整(zheng),因(yin)此(ci)可(ke)以(yi)適(shi)當(dang)的(de)調(tiao)整(zheng)這(zhe)些(xie)指(zhi)令(ling)的(de)位(wei)置(zhi),穿(chuan)插(cha)於(yu)其(qi)他(ta)的(de)指(zhi)令(ling)之(zhi)中(zhong),從(cong)而(er)減(jian)小(xiao)指(zhi)令(ling)的(de)相(xiang)關(guan)性(xing),增(zeng)加(jia)運(yun)行(xing)時(shi)的(de)並(bing)行(xing)性(xing)。
尤you其qi在zai循xun環huan裏li,當dang循xun環huan體ti較jiao小xiao的de時shi候hou,可ke以yi把ba多duo個ge循xun環huan的de代dai碼ma寫xie在zai一yi個ge循xun環huan體ti裏li,合he並bing成cheng一yi個ge循xun環huan,從cong而er減jian小xiao循xun環huan內nei指zhi令ling的de相xiang關guan性xing,增zeng加jia指zhi令ling運yun行xing的de並bing行xing性xing。但dan是shi要yao注zhu意yi不bu要yao使shi循xun環huan過guo於yu複fu雜za,否fou則ze很hen可ke能neng會hui導dao致zhi不bu能neng進jin行xing軟ruan件jian流liu水shui線xian的de優you化hua。












