一、優化流程一般分為三個階段。
階段一:直接按照需要用c語言實現功能。在實際的dsp應用中,許多演算法直接用彙編**編寫,雖然優化效率很高,可是實現的難度卻很大,所以一般先用c語言來實現,然後編譯執行,利用c64x開發環境的profile; clock工具測試程式執行時間,若不能滿足要求,則進行第二階段。
階段二:c語言級的優化。選擇c64x開發環境提供的優化方式以及充分運用其他技巧,優化c**,若還不能滿足效率要求,則進行第三步。
階段三:彙編級的優化。將上一階段c程式中優化效率較低的部分提出來,用線性組合語言編寫,利用彙編優化器進行優化。彙編優化器的作用是讓開發人員在不考慮c64x流水線結構和分配其內部暫存器的情況下,編寫線形組合語言程式,然後彙編優化器通過分配暫存器和迴圈優化將組合語言程式轉化為利用流水線方式的高速並行匯程式設計序。上述的三個階段不是都必須經過,當在某一階段獲得了期望的效能,就不必進行下一階段的優化。
二、選用c編譯器提供的優化選項
● -o:使能軟體流水和其他優化方法
● -pm:使能程式級優化
● -mt:使能編譯器假設程式中沒有資料儲存混淆,可進一步優化**。
● -mg:使能分析(profile)優化**
● -ms:確保不產生冗餘迴圈,從而減小**尺寸
● -mh:允許投機執行
● -mx:使能軟體流水迴圈重試,基於迴圈次數對迴圈試用多個方案,以便選擇最佳方案。
三、減小儲存器相關性為使指令達到最大效率
c64x編譯器盡可能將指令安排為並行執行。為使指令並行操作,編譯器必須知道指令間的關係,因為只有不相關的指令才可以並行執行。當編譯器不能確定兩條指令是否相關時,則編譯器假定它們是相關的,從而不能並行執行。設計中常採用關鍵字const來指定目標,const表示乙個變數或乙個變數的儲存單元保持不變。因此,在**中加入關鍵字const,可以去除指令間的相關性。例如下面的程式:
void vecsum(short *sum,short*in1,short*in2,unsigned int n)
{ int i;
for(i=0;isum[i]=in1[i]+in2[i];
寫sum可能對指標in1、in2所指向的位址有影響,從而in1和in2的讀操作必須等到寫sum操作完成之後才能進行,降低了流水效率,為幫助編譯器確定儲存器的相關性,使用const關鍵字來指定乙個目標,上面的源程式可改為含關鍵字const的優化源**:
void vecsum(short *sum, const short*in1,const short*in2,unsigned int n)
{ int i;
for(i=0;isum[i]=in1[i]+in2[i];
由於使用了關鍵字const,消除了指令之間的相關路徑,從而使編譯器能夠判別記憶體操作之間的相關性,找到更好的指令執行方案。
四、 使用內聯函式(intrinsics)
內聯函式是c64x編譯器提供的專門函式,它們與嵌入式的彙編指令是一一對應的,其目的是快速優化c源程式。在源程式中呼叫內聯函式,與呼叫一般的函式相同,只不過內聯函式名稱前有下劃線作特殊標識。當彙編指令功能不易採用c語言表達時,可採用內聯函式表示。例如在定點運算中經常要求出源運算元的冗餘符號位數,這一功能如果用c完成的話,需要的源程式**冗長,有較多的邏輯操作和判斷跳轉,執行效率低下。若用內聯函式,則是result =_norm(src1),減少了**長度,提高了執行效率。因此對於需要大量c**才能表示的複雜功能,應該盡量用c64x的內聯函式來表示。
五、short型資料的int處理
c64xdsp具有雙16bit擴充功能,晶元能在乙個週期內完成雙16bit的乘法、加減法、比較、移位等操作。在設計時,當對連續的short型資料流操作時,應該轉化成對int型資料流的操作,這樣一次可以把兩個16位的資料讀入乙個32位的暫存器,然後用內部函式來對它們處理(如_sub2等),充分運用雙16bit擴充功能,一次可以進行兩個16bit資料的運算,速度將提公升一倍。
六、盡量少進行函式呼叫
函式呼叫的時候,要將pc和一些暫存器壓棧儲存,函式返回時,則將這些暫存器出棧返回,增加了一些不必要的操作。所以一些小的函式,最好是用適當的內聯函式代替直接寫入主函式裡,一些呼叫不多的函式,也可以直接寫入主函式內,這樣可減少不必要的操作,提高速度。但是這樣往往會增加程式的長度,因此是一種利用空間換取時間的辦法。
七、 盡量使用邏輯運算代替乘除運算
在dsp裡,乘除運算指令的執行時間要遠遠超過邏輯移位指令,尤其是除法指令,在設計的時候,可以根據實際情況,進行一些調整,盡量用邏輯移位運算來代替乘除運算,這樣可以加快指令的執行時間。
八、軟體流水線技術的使用
軟體流水線技術用來對乙個迴圈結構的指令進行排程安排,使之成為多重迭代迴圈並行執行。在編譯**時,可以選擇編譯器的-o2或-o3選項,則編譯器將根據程式盡可能地安排軟體流水線。在dsp演算法中存在大量的迴圈操作,因此充分地運用軟體流水線方式,能極大地提高程式的執行速度。但使用軟體流水線還有下面幾點限制:
● 迴圈結構不能包含**呼叫,但可以包含內聯函式。
● 迴圈計數器應該是遞減的。
● 迴圈結構不能包含break,if語句不能巢狀,條件**應當盡量的簡單。
● 迴圈結構中不要包含改變迴圈計數器的**。
● 迴圈體**不能過長,因為暫存器(32個)的數量有限,應該分解為多個迴圈。
在軟體流水線的運用上,應該盡量使複雜的迴圈分解成簡單的小迴圈,以避免暫存器的數量不夠;對於過於簡單的迴圈,應該適當的展開,以增加**數量,增加流水線中的迭代指令。
九、 採用指令亂序技術
程式中,有些指令的執行順序沒有嚴格的要求,可以作出一些位置上的調整,因此可以適當的調整這些指令的位置,穿插於其他的指令之中,從而減小指令的相關性,增加執行時的並行性。尤其在迴圈裡,當迴圈體較小的時候,可以把多個迴圈的**寫在乙個迴圈體裡,合併成乙個迴圈,從而減小迴圈內指令的相關性,增加指令執行的並行性。但是要注意不要使迴圈過於複雜,以至不能進行軟體流水線的優化。
mysql 優化策略 mysql的優化策略有哪些
第一 優化你的sql和索引 1.善用explain,看看自己寫的sql到底要涉及到多少表,多少行,使用了那些索引,根據這些資訊適當的建立索引 2.善用不同的儲存引擎,mysql有多種不同的儲存引擎,innodb,aria,memory根據需要給不同的表選擇不同的儲存引擎,比如要支援transacti...
not in 優化策略
總結們在csdn社群上對於not in的優化策略,整理如下,備查。select from emp where emp no not in select emp no from emp bill 要求用兩種 sql寫法優化上面 sql。方法一 select from emp a where notex...
Oracle 優化策略
1.普通表轉分割槽表 大表 2g,多於1000萬條記錄 2.索引 減少非索引掃瞄 建立索引在約束條件列,選擇性高列,被驅動表 內錶 連線列 驅動表的連線列不一定 結果集在總行數的2 4 應建索引 編號,日期,外來鍵 函式索引 query rewrite integrity trusted,query...