perflab實驗報告69628_第1頁
perflab實驗報告69628_第2頁
perflab實驗報告69628_第3頁
perflab實驗報告69628_第4頁
perflab實驗報告69628_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、課程實驗報告 課 程 名 稱: 計算機組成與結構 實驗項目名稱: perflab-handout 專 業(yè) 班 級: 姓 名: 學 號: 指 導 教 師: 楊科華 完 成 時 間: 2016 年 5 月 27 日信息科學與工程學院實驗題目:perflab程序性能調優(yōu)實驗目的:理解編譯器,學習程序優(yōu)化,從優(yōu)化程序代碼和程序執(zhí)行速度兩方面著手。實驗要求:本次實驗,要求針對每個函數(shù)、每個人均至少寫出3種優(yōu)化版本、并根據driver報告的結果進行性能分析實驗環(huán)境: ubuntu-15.10、 x32系統(tǒng) 、VMware workstation實驗內容及操作步驟:   

2、60;     將下載下來的 kernels.c 中的 rotate、smooth 函數(shù)進行優(yōu)化。 rotate函數(shù)的作用是將圖像逆時針旋轉90°,smooth函數(shù)的作用是對于圖像中的每一個像素點,取它和周圍的像素點的平均值,讓圖片變得模糊。下面對代碼進行逐一優(yōu)化。源代碼的CPE測試:1.Naive_rotate 1)源代碼:char naive_rotate_descr = "naive_rotate: Naive baseline implementation"void naive_rotate(in

3、t dim, pixel *src, pixel *dst) int i, j; for (i = 0; i < dim; i+)for (j = 0; j < dim; j+) dstRIDX(dim-1-j, i, dim) = srcRIDX(i, j, dim);2)分析:這段代碼的作用就是用一個雙層循環(huán)將所有的像素進行行列調位、導致整幅圖畫進行了 90 度旋轉。然而分析一下代碼就能發(fā)現(xiàn)一個十分簡單的優(yōu)化方法:因為在最內層循環(huán)中,j的值每次都會改變,所以每執(zhí)行一次賦值就要計算一次dim-1-j,算多了自然就慢了。我們可以利用簡單的數(shù)學技巧改寫公式,將賦值語句改成dstRID

4、X(i, j, dim) = srcRIDX(j, dim-i-1, dim); 這樣就不用每次都計算了。3)優(yōu)化代碼1如下:char naive_rotate_descr2 = "naive_rotate2: only change the place of i and j"void naive_rotate2(int dim, pixel *src, pixel *dst) int i, j; for (i = 0; i < dim; i+) for (j = 0; j < dim; j+) dstRIDX(i, j, dim) = srcRIDX(j, d

5、im-i-1, dim);/i change less 優(yōu)化結果如下:這是一種最為簡單的優(yōu)化方案,由圖可知,速度提升不大,性能優(yōu)化結果也不是很好。再分析源代碼,從 cache 友好性來分析,這個代碼的效率機會很低, 所以按照 cache 的大小, 應在存儲的時候進行 32 個像素依次存儲 (列 存儲)。做到 cache 友好這樣就可以可以大幅度提高效率。4)優(yōu)化代碼2如下:char rotate_descr2 = "rotate2: version2 break into 4*4 blocks" void rotate2(int di

6、m, pixel *src, pixel*dst) int i, j,ii,jj; for(ii=0; ii < dim; ii+=4)for(jj=0; jj < dim; jj+=4)for(i=ii; i < ii+4; i+)for(j=jj; j < jj+4; j+) dstRIDX(dim-1-j,i,dim) = srcRIDX(i,j,dim); 優(yōu)化結果如下:用分塊的方式,進行優(yōu)化。將整個程序分成4*4的小塊,提高空間局部性5)優(yōu)化代碼3如下:char rotate_descr3 = "rotate3: version3 break int

7、o 32*32 blocks"void rotate3(int dim, pixel *src, pixel *dst) int i, j,ii,jj; for(ii=0; ii < dim; ii+=32)for(jj=0; jj < dim; jj+=32)for(i=ii; i < ii+32; i+)for(j=jj; j < jj+32; j+) dstRIDX(dim-1-j,i,dim) = srcRIDX(i,j,dim); 優(yōu)化結果如下:分成32*32塊,提高空間局部性6)優(yōu)化代碼4如下:char rotate_descr4 = "

8、rotate4: Current working version,using pointer rather than computing address"void rotate4(int dim, pixel *src, pixel *dst) int i; int j; int tmp1=dim*dim; int tmp2=dim *31; int tmp3=tmp1-dim; int tmp4=tmp1+32; int tmp5=dim+31; dst+=tmp3; for(i=0; i< dim; i+=32) for(j=0;j<dim;j+) *dst=*src

9、; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=di

10、m; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src;

11、dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; src+; src-=tmp2; dst-=tmp5; src+=tmp2; dst+=tmp4; 優(yōu)化結果如下:用循環(huán)展開,分成32路并行來寫2.Naive_smooth1)源代碼c

12、har naive_smooth_descr = "naive_smooth: Naive baseline implementation"void naive_smooth(int dim, pixel *src, pixel *dst) int i, j; for (i = 0; i < dim; i+)for (j = 0; j < dim; j+) dstRIDX(i, j, dim) = avg(dim, i, j, src);CPES性能如下:2)分析這段代碼很多次地調用 avg 函數(shù),而 avg 函數(shù)內也頻繁調用 initialize_pixel_

13、sum 、 accumulate_sum、assign_sum_to_pixel 這幾個函數(shù),且含有 2 層 for 循環(huán)。雖然會以損害程序的模塊性為代價,但消除函數(shù)調用的時間開銷,得到的代碼運行速度會快得多。所以,需要改寫代碼,不調用 avg 函數(shù)。 3)優(yōu)化代碼1如下:char smooth_descr1 = "smooth1: with less func call and grossly simplified calculation for central parts"void smooth1(int dim, pixel *src, pixel *dst) int

14、 i, j, ii, jj; pixel_sum sum; pixel current_pixel, cp; for (j = 0; j < dim; j+) dstRIDX(0, j, dim) = avg(dim, 0, j, src); dstRIDX(dim-1, j, dim) = avg(dim, dim-1, j, src); for (i = 0; i < dim; i+) dstRIDX(i, 0, dim) = avg(dim, i, 0, src); dstRIDX(i, dim-1, dim) = avg(dim, i, dim-1, src); for (

15、i = 1; i < dim-1; i+) for (j = 1; j < dim-1; j+) sum.red = sum.green = sum.blue = 0; for(ii = max(i-1, 0); ii <= min(i+1, dim-1); ii+) for(jj = max(j-1, 0); jj <= min(j+1, dim-1); jj+) cp=srcRIDX(ii,jj,dim); sum.red += cp.red; sum.green += cp.green; sum.blue += cp.blue; current_pixel.red

16、 = sum.red/9; current_pixel.green = sum.green/9; current_pixel.blue = sum.blue/9; dstRIDX(i, j, dim) = current_pixel; 優(yōu)化結果如下:4)優(yōu)化代碼2如下:char smooth_descr2 = "smooth2: test version"void smooth2(int dim, pixel *src, pixel *dst) int i,j; /no using avg() /corners dstRIDX(0,0,dim).red=(srcRIDX(0

17、,0,dim).red+srcRIDX(1,0,dim).red+srcRIDX(0,1,dim).red+srcRIDX(1,1,dim).red)>>2; dstRIDX(0,0,dim).blue=(srcRIDX(0,0,dim).blue+srcRIDX(1,0,dim).blue+srcRIDX(0,1,dim).blue+srcRIDX(1,1,dim).blue)>>2; dstRIDX(0,0,dim).green=(srcRIDX(0,0,dim).green+srcRIDX(1,0,dim).green+srcRIDX(0,1,dim).green

18、+srcRIDX(1,1,dim).green)>>2; dstRIDX(0,dim-1,dim).red=(srcRIDX(0,dim-1,dim).red+srcRIDX(1,dim-1,dim).red+srcRIDX(0,dim-2,dim).red+srcRIDX(1,dim-2,dim).red)>>2; dstRIDX(0,dim-1,dim).blue=(srcRIDX(0,dim-1,dim).blue+srcRIDX(1,dim-1,dim).blue+srcRIDX(0,dim-2,dim).blue+srcRIDX(1,dim-2,dim).bl

19、ue)>>2; dstRIDX(0,dim-1,dim).green=(srcRIDX(0,dim-1,dim).green+srcRIDX(1,dim-1,dim).green+srcRIDX(0,dim-2,dim).green+srcRIDX(1,dim-2,dim).green)>>2; dstRIDX(dim-1,0,dim).red=(srcRIDX(dim-1,0,dim).red+srcRIDX(dim-2,0,dim).red+srcRIDX(dim-1,1,dim).red+srcRIDX(dim-2,1,dim).red)>>2; ds

20、tRIDX(dim-1,0,dim).blue=(srcRIDX(dim-1,0,dim).blue+srcRIDX(dim-2,0,dim).blue+srcRIDX(dim-1,1,dim).blue+srcRIDX(dim-2,1,dim).blue)>>2; dstRIDX(dim-1,0,dim).green=(srcRIDX(dim-1,0,dim).green+srcRIDX(dim-2,0,dim).green+srcRIDX(dim-1,1,dim).green+srcRIDX(dim-2,1,dim).green)>>2; dstRIDX(dim-1

21、,dim-1,dim).red=(srcRIDX(dim-1,dim-1,dim).red+srcRIDX(dim-1,dim-2,dim).red+srcRIDX(dim-2,dim-1,dim).red+srcRIDX(dim-2,dim-2,dim).red)>>2; dstRIDX(dim-1,dim-1,dim).blue=(srcRIDX(dim-1,dim-1,dim).blue+srcRIDX(dim-1,dim-2,dim).blue+srcRIDX(dim-2,dim-1,dim).blue+srcRIDX(dim-2,dim-2,dim).blue)>&

22、gt;2; dstRIDX(dim-1,dim-1,dim).green=(srcRIDX(dim-1,dim-1,dim).green+srcRIDX(dim-1,dim-2,dim).green+srcRIDX(dim-2,dim-1,dim).green+srcRIDX(dim-2,dim-2,dim).green)>>2; /boarderfor(i=1;i<dim-1;i+) dstRIDX(i,0,dim).red=(srcRIDX(i,0,dim).red+srcRIDX(i-1,0,dim).red+srcRIDX(i-1,1,dim).red+srcRIDX

23、(i,1,dim).red+srcRIDX(i+1,0,dim).red+srcRIDX(i+1,1,dim).red)/6; dstRIDX(i,0,dim).blue=(srcRIDX(i,0,dim).blue+srcRIDX(i-1,0,dim).blue+srcRIDX(i-1,1,dim).blue+srcRIDX(i,1,dim).blue+srcRIDX(i+1,0,dim).blue+srcRIDX(i+1,1,dim).blue)/6; dstRIDX(i,0,dim).green=(srcRIDX(i,0,dim).green+srcRIDX(i-1,0,dim).gre

24、en+srcRIDX(i-1,1,dim).green+srcRIDX(i,1,dim).green+srcRIDX(i+1,0,dim).green+srcRIDX(i+1,1,dim).green)/6;for(i=1;i<dim-1;i+) dstRIDX(i,dim-1,dim).red=(srcRIDX(i,dim-1,dim).red+srcRIDX(i-1,dim-1,dim).red+srcRIDX(i-1,dim-2,dim).red+srcRIDX(i,dim-2,dim).red+srcRIDX(i+1,dim-1,dim).red+srcRIDX(i+1,dim-

25、2,dim).red)/6; dstRIDX(i,dim-1,dim).blue=(srcRIDX(i,dim-1,dim).blue+srcRIDX(i-1,dim-1,dim).blue+srcRIDX(i-1,dim-2,dim).blue+srcRIDX(i,dim-2,dim).blue+srcRIDX(i+1,dim-1,dim).blue+srcRIDX(i+1,dim-2,dim).blue)/6; dstRIDX(i,dim-1,dim).green=(srcRIDX(i,dim-1,dim).green+srcRIDX(i-1,dim-1,dim).green+srcRID

26、X(i-1,dim-2,dim).green+srcRIDX(i,dim-2,dim).green+srcRIDX(i+1,dim-1,dim).green+srcRIDX(i+1,dim-2,dim).green)/6; for(j=1;j<dim-1;j+) dstRIDX(0,j,dim).red=(srcRIDX(0,j,dim).red+srcRIDX(0,j-1,dim).red+srcRIDX(1,j-1,dim).red+srcRIDX(1,j,dim).red+srcRIDX(0,j+1,dim).red+srcRIDX(1,j+1,dim).red)/6; dstRI

27、DX(0,j,dim).blue=(srcRIDX(0,j,dim).blue+srcRIDX(0,j-1,dim).blue+srcRIDX(1,j-1,dim).blue+srcRIDX(1,j,dim).blue+srcRIDX(0,j+1,dim).blue+srcRIDX(1,j+1,dim).blue)/6; dstRIDX(0,j,dim).green=(srcRIDX(0,j,dim).green+srcRIDX(0,j-1,dim).green+srcRIDX(1,j-1,dim).green+srcRIDX(1,j,dim).green+srcRIDX(0,j+1,dim)

28、.green+srcRIDX(1,j+1,dim).green)/6; for(j=1;j<dim-1;j+) dstRIDX(dim-1,j,dim).red=(srcRIDX(dim-1,j,dim).red+srcRIDX(dim-1,j+1,dim).red+srcRIDX(dim-1,j-1,dim).red+srcRIDX(dim-2,j,dim).red+srcRIDX(dim-2,j+1,dim).red+srcRIDX(dim-2,j-1,dim).red)/6; dstRIDX(dim-1,j,dim).blue=(srcRIDX(dim-1,j,dim).blue+

29、srcRIDX(dim-1,j+1,dim).blue+srcRIDX(dim-1,j-1,dim).blue+srcRIDX(dim-2,j,dim).blue+srcRIDX(dim-2,j+1,dim).blue+srcRIDX(dim-2,j-1,dim).blue)/6; dstRIDX(dim-1,j,dim).green=(srcRIDX(dim-1,j,dim).green+srcRIDX(dim-1,j+1,dim).green+srcRIDX(dim-1,j-1,dim).green+srcRIDX(dim-2,j,dim).green+srcRIDX(dim-2,j+1,

30、dim).green+srcRIDX(dim-2,j-1,dim).green)/6; /common for(i=1;i<dim-1;i+) for(j=1;j<dim-1;j+) dstRIDX(i,j,dim).red=(srcRIDX(i,j,dim).red+srcRIDX(i+1,j,dim).red+srcRIDX(i-1,j,dim).red+srcRIDX(i,j-1,dim).red+srcRIDX(i+1,j-1,dim).red+srcRIDX(i-1,j-1,dim).red+srcRIDX(i,j+1,dim).red+srcRIDX(i+1,j+1,dim).red+srcRIDX(i-1,j+1,dim).red)/9; dstRIDX(i,j,dim).blue=(srcRIDX(i,j,dim).blue+srcRIDX(i+1,j,dim).blue+srcRIDX(i-1,j,dim).blue+srcRIDX(i,j-1,dim).blue+srcRIDX(i+1,j-1,dim).blue+srcRIDX(i-1,j-1,dim).blue+srcRIDX(i,j+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論