1. 程式人生 > >深入理解計算機系統 perflab 程式效能優化實驗

深入理解計算機系統 perflab 程式效能優化實驗

自從上次實驗3bomb已經過去很久了,昨天週六下午剛剛驗收完所帶班級的必做實驗的最後兩個,最近一直很忙,也沒有來更新了,其實不是最近應該是每天都好忙,最近一直還在看論文做實驗。

驗收前週五拿出時間來看了一下最後兩個必做實驗。一個是perflab,效能實驗,這個實驗主要是考察的課本中的第五章的程式優化的一些知識,通過優化程式的核函式,然後來對比自己和原始函式的CPE和加速比。

這個實驗主要考慮一些優化措施,裡面有兩個函式,一個rotate函式,rotate函式是將影象實現逆時針旋轉90°,針對這個函式的優化,


1交換內外迴圈的次序,優先考慮寫操作

2迴圈展開

3迴圈分塊,這個最有效的優化,主要是可以檢視提供的函式頭裡面關於cache的大小,根據cache的大小來設定塊的大小,做到cache友好性,提高命中率。開始很多同學只是懂把迴圈分塊了,但是不懂為什麼不是塊越大越好,因為如果比cache大了,超出的部分又不命中了。


第二個函式是smooth函式,用來實現類似於求圖片中每個元素所在的九宮格的平均值,然後將該值放到該元素中。

 



這裡最大函式缺陷就是每次都去重複的讀取元素。

首先看到smooth函式在兩層for迴圈中還去呼叫一個avg函式,就要去看看avg函式做一些優化。

看到avg函式中也有兩層for迴圈,而且for迴圈中的條件賦值語句不是一個值而是一個min和max的函式呼叫,果斷提到for外邊先求出值,儲存為臨時變數,減少每次的呼叫計算次數。也就是儘量減少函式呼叫,另外同理將呼叫巨集函式RIDX的計算結果也儲存起來,減少計算和呼叫的次數。

但是這些做完的實驗結果不是非常明顯的優化。

主要是smooth中有兩層for迴圈,而呼叫的avg函式中也是兩層for迴圈,而且原函式每次都是去掃描,所以重複讀取很多以前已經讀取過的元素了,最好的優化就是不去呼叫原函式的avg而是自己實現一個avg,分情況逐一實現求取平均值,考慮邊角元素,邊上元素,以及中間元素等幾種情況分別來實現。這樣的優化帶來很大的提高,但是函式變的非常冗長而且可讀性非常差,用低可讀性的代價來換來程式的優化效能。

這個實驗就是這樣,主要考察一些程式效能優化的方法,減少過程呼叫,消除不必要的暫存器引用,迴圈展開,分塊cache友好性等。