延遲:表示完成運算所需的總時間
發射時間:表示兩個連續的同型別運算之間需要的最小時鐘週期數
容量:表示能夠執行該運算的功能單元的數量
我們看到,從整數運算到浮點運算,延遲是增加的。還可以看到加法和乘法運算的發射時間都為1,意思是說在每個時鐘週期,處理器都可以開始一條新的這樣的運算。這種很短的發射時間都是通過使用***流水線***實現的。發射時間為1的功能單元被稱為***完全流水線化的***:每個時鐘週期可以開始乙個新的運算。表示發射時間的一種更常見的方法是指明這個功能單元的最大吞吐量,定義為發射時間的倒數。
延遲界限給出了任何必須按照嚴格順序完成合併運算的函式所需要的最小cpe值。吞吐量界限給出了cpe的最小界限。
我們可以將訪問到的暫存器分為四類:
唯讀:這些暫存器只用做源值,可以作為資料,也可以用來計算記憶體位址,但是在迴圈中他們是不會被修改的。
只寫:這些暫存器作為資料傳送操作的目的。
區域性:這些暫存器在迴圈內部被修改和使用,迭代與迭代之間不相關。
迴圈:對於迴圈來說,這些暫存器既作為源值,又作為目的,一次迭代中產生的值會在另一次迭代中用到。(***迴圈暫存器之間的操作鏈決定了限制效能的資料相關!***)
乙個原則:資料流表示中的關鍵路徑提供的只是程式需要週期數的下界。還有其他一些因素會限制效能,包括可用的功能單元的數量和任何一步中功能單元之間能夠傳遞資料值的數量。
乙個常用的優化程式的方法是迴圈展開,迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。迴圈展開能夠從兩個方面改進程式的效能。首先,他減少了不直接有助於程式結果的操作的數量,例如迴圈索引計算和條件分支。第二,它提供了一些方法,可以進一步變化**,減少整個計算中關鍵路徑上的運算元量。
/* 2 x 1 loop unrolling */
void combine5(vec_ptr v,data_t *dest)
/* finish any remaining elements */
for(; i < length ;i++)
*dest = acc;
}
一般來說,向量長度不一定是2的倍數。想要使我們的**對任意向量長度都能正確工作,可以從兩個方面來解釋這個需求。首先,要確保第一次迴圈不會超出陣列的界限。對於長度為n的向量,我們將迴圈界限設為n-1。然後,保證只有當迴圈索引i滿足i
把這個思想歸納為對乙個迴圈按任意因子k進行展開,由此產生kx1迴圈展開。為此,上限設為n-k+1,在迴圈內對元素i到i+k-1應用合併運算。每次迭代,迴圈索引i+k。那麼最大迴圈索引i+k-1會小於n。要使用第二個迴圈,以每次處理乙個元素的方式處理向量的最後幾個元素。這個迴圈體將會執行0~k-1次。
優化程式效能
編寫高效程式需要兩個活動 第一,我們必須選擇一組最好的演算法和資料結構 第二,我們必須編寫出編譯器能夠有效優化以轉換成高效可執行 的源 這裡,我們主要講述後者。首先,我們討論一下為什麼要編寫高效程式。不難想象,如果本來要用 天執行完的程式,經過優化只需要 天就可執行完,這是一件多麼令人振奮的 事啊。...
優化程式效能
l 消除迴圈的低效率 n 對於迴圈中的過程呼叫盡量移出迴圈外,例如 nfor i 0 i strlen s i strlen 函式為線性增長 在字串長度很大時 很消耗系統資源 n 減少不必要的儲存器引用,將儲存器引用儲存在臨時變數中.l 處理器優化 即充分利用儲存器流水線操作的吞吐量 n 迴圈展開,...
優化程式效能
研究彙編 是理解編譯器以及產生的 會如何執行的最有效的手段之一。編譯器優化 的限制 1 程式設計中存在 儲存器別名使用 的問題。編譯器必須假設不同的指標可能指向儲存器中相同的位置。2 函式呼叫 簡略了。具體看書 基本的編碼原則 效能大幅度提公升 優化程式效能的一些方法 1 將除錯完的程式完成編譯器級...