1)高階設計:適當的演算法和資料結構
2)基本編碼原則:使編譯器產生高效的**,理解 編譯器 的能力和侷限性,消除不必要的內容
·消除連續的函式呼叫
·消除不必要的儲存器引用,要考慮是否為 同一位址
以上兩點,也是妨礙編譯器優化的主要因素,編譯器很難判斷以進行優化。
3)低階優化:將乙個任務分成多個部分,利用多核和多處理器的平行計算;了解計算機的時序特性,為實現指令集並行,降低不同部分之間的資料相關;利用圖形資料流和確認關鍵路徑來確定乙個迴圈需要的時間下界
·迴圈展開,**移動(將迴圈中不會變的計算部分,移到迴圈外邊,如 for(int i=0;i
·多個累計變數和重新結合(如資料結合,整形編譯器可以自動重新結合,浮點數因為精度的原因,不會)等
·用功能的風格重寫條件操作,用條件傳遞代替條件控制,減小 **懲罰
1)表示程式效能:每元素的週期數(cycles per element,cpe),越小越好,線性執行時間時,即為線性變數n的係數。
延遲界限(latency bound):當一系列操作必須按照嚴格順序執行時
吞吐量界限(throughput bound):處理器功能單元的原始計算能力
2)現代處理器包括:指令控制單元(instruction control unit,icu) (取址和解碼 控制、退役單元(記錄正在進行的處理,確保他遵守機器級程式的順序語義))、執行單元(execution unit,eu)(功能單元和快取記憶體的控制)。
3)一些限制因素:暫存器溢位(暫存器不夠用)、**錯誤處罰
5)**剖析程式
unix>gcc -o1-pgprog.c -o prog
unix> ./prog file.txt
unix>gprofprog
6)amdahl 定律
s=told / tnew = 1/( (1-a)+a/k ),a 為系統某部分需要時間的百分比,將他的效能提高了k倍。
文中有很多 例子的**和資料流圖,很不錯。
程式效能優化 深入理解計算機系統
對暫存器的訪問的優化 暫存器訪問優化的核心是盡量避免打斷流水線 a.指令之間資料依賴的時候 如存在對同乙個暫存器的讀寫依賴 b.指令之間存在控制依賴的時候 如條件轉移 注意的是,並不是只有兩條相鄰的指令才會存在依賴 只要是同時出現在流水線中任意兩條指令都可能出現依賴 以f fetch d decod...
深入理解計算機系統 優化程式效能(1)
1 優化編譯器的能力和侷限性 1 編譯器有自己能夠優化程式的能力,但會有侷限性。指標指向記憶體的同一位置 例如 void twiddle1 long xp,long yp void twiddle2 long xp,long yp 函式twiddle1需要6次記憶體引用 2次讀 xp,2次讀 yp,...
深入理解計算機系統 優化程式效能學習筆記
迴圈展開 提高並行性 一些限制因素 理解記憶體效能 應用 效能提高技術 確認和消除效能瓶頸 當字串越長lower1與lower2的效率差距越大 不要過分關心可 的分支 錯誤的分支 影響可能會非常大,但是現代處理器中的分支 邏輯非常善於辨別不同的分支指令的有規律的模式和長期的趨勢。書寫適合用條件傳送實...