




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程實驗報告 課 程 名 稱: 計算機組成與結構 實驗項目名稱: perflab-handout 專 業(yè) 班 級: 計科1403 姓 名: 學 號: 指 導 教 師: 黃麗達 完 成 時 間: 2016 年 5 月 28 日信息科學與工程學院實驗題目:perflab-handout實驗目的:本次實驗的核心任務是要求修改kernel.c文件,并可以在使用driver進行評測時獲得更好的加速比。kernel.c文件中主要有兩個需要進行優(yōu)化的函數:rotate和smooth,并分別給出了naive_rotate和naive_smooth兩個函數的基本實現作為baseline作為你改進后的程序的比較對
2、象。本次實驗,要求針對每個函數、每個人均至少寫出3種優(yōu)化版本、并根據driver報告的結果進行性能分析。實驗環(huán)境:聯(lián)想ThinkPad E545,Ubuntu14(32位)gdb工具實驗內容及操作步驟:rotate原始代碼分析:void naive_rotate(int 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);首先要理解RIDX的意思,在頭文件defs.h中
3、宏定義了#defineRIDX(i,j,n) (i)*(n)+(j),意思是一個n*n的二維數組的第i行,第j列。所以這段代碼的是把一幅畫進行逆時針方向旋轉90°該函數將所有的像素進行了行列調位、導致整幅圖畫進行了逆時針90°旋轉。分析代碼性能不好的因素:原代碼由于使用了兩重for循環(huán),而且每一重for循環(huán)的循環(huán)次數為dim次,循環(huán)次數過多導致程序的性能非常差,優(yōu)化方法一是減少循環(huán)次數,采用循環(huán)展開可以減少循環(huán)的次數達到優(yōu)化效果。優(yōu)化1:void rotate(int dim, pixel *src, pixel *dst) int i, j; for (i = 0; i
4、< dim-1; i=i+2) for (j = 0; j < dim; j+) dstRIDX(dim-1-j, i, dim) =srcRIDX(i,j,dim); dstRIDX(dim-1-j,i+1,dim) = srcRIDX(i+1,j,dim); for (; i < dim; i+) dstRIDX(dim-1-j, i, dim) =srcRIDX(i,j,dim); 運行結果截圖:從上述截圖可以看出,當將循環(huán)展開成每次做兩個像素點的旋轉時,程序的性能明顯提高,原來代碼的加速比是1.3,優(yōu)化后性能是原始代碼的兩倍,所以循環(huán)展開可以提高程序的性能。優(yōu)化2:循
5、環(huán)分塊與寫優(yōu)先操作結合可以提高性能,原代碼因為循環(huán)步長太長,以至于cache的命中率非常低,所以總體運算效率不高。因此,我考慮到cache的大小,應在存儲的時候進行32個像素依次存儲(列存儲)。(32個像素排列是為了充分利用一級緩存(32KB), 采用分塊策略, 每一個塊大小為32)這樣可以做到cache友好、可以大幅度提高效率,同時寫優(yōu)先操作(寫地址連續(xù))比原代碼的讀優(yōu)先操作(讀地址連續(xù))性能會更好。void rotate(int dim, pixel *src, pixel *dst) int i, j, i1, j1, im, jm; int block=32;/blocking the
6、 Matrix for(i=0; i<dim; i+=block) for(j=0; j<dim; j+=block) /block*block mini matrix im = i+block; for(i1=i; i1<i+block; i1+) jm = j+block; for(j1=j; j1<j+block; j1+) dstRIDX(i1, j1, dim) = srcRIDX(j1, dim-i1-1, dim); 從上述截圖可以看出,當將循環(huán)步長分成最大為32,優(yōu)先dest的寫操作時,程序的性能明顯提高,原來代碼的加速比是1.3,優(yōu)化后性能是原始代碼的
7、三倍多,所以循環(huán)分塊與寫優(yōu)先操作結合可以提高性能。優(yōu)化3:循環(huán)展開類循環(huán)分塊結合,通過減少每次迭代計算元素的數量,減少循環(huán)的迭代次數,同時分塊可以逐點賦值>逐行(列)賦值 充分利用塊空間,防止前面開辟的塊還沒有完全利用就被后來的覆蓋,提高cache命中率 。void rotate(int dim, pixel *src, pixel *dst) int i,j;int dst_base=(dim-1)*dim;dst+=dst_base;for(i=0;i<dim;i+=32)for(j=0;j<dim;j+)*dst=*src;src+=dim;dst+;*dst=*src
8、;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;ds
9、t+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src
10、;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+=dim;dst+;*dst=*src;src+;src-=(dim<<5)-dim;dst-=31+dim;dst+=dst_base+dim;dst+=32;src+=(dim<<5)-dim;從上述截圖可以看出,當將循環(huán)展開32次,同時進行類分塊時,程序的性能明顯提高,原來代碼的加速比是1.8,優(yōu)化后性能是原始代碼的四倍多,所以循環(huán)展開類循環(huán)分塊結合可以大大提高程序
11、性能。smooth原始代碼分析: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);這段代碼的是把一幅畫復制一份贗品,贗品的某點的像素為對應原畫的周圍像素的平均值(如果該像素點在四個頂點,則贗品的該點像素等于原畫包括該點的周圍四個點的像素平均,如果該像素點為四條邊界上的像素點,則贗品的該點像素點等于原畫包括該點的周圍六個點的像素平均值,
12、如果該像素點為中間點,則該點像素為原畫的周圍九個點的平均值)。分析代碼性能不好的因素:這段代碼頻繁地調用avg函數,并且avg函數中也頻繁調用initialize_pixel_sum 、accumulate_sum、assign_sum_to_pixel這幾個函數,且又含有2層for循環(huán),而我們應該減少函數調用的時間開銷。所以,需要改寫代碼,不調用avg函數。優(yōu)化1:不調用avg函數,把avg函數寫進smooth函數主體中,通過減少函數調用來達到優(yōu)化程序的目的。void smooth(int dim, pixel *src, pixel *dst) int i, j; for (i
13、= 0; i < dim; i+) for (j = 0; j < dim; j+) int ii, jj; pixel_sum sum; pixel current_pixel; sum.red= sum.green = sum.blue = 0; sum.num= 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+) pixel p=srcRIDX(ii, jj, dim); sum.red += (int) p.red
14、; sum.green+= (int) p.green; sum.blue+= (int) p.blue; sum.num+; current_pixel.red = (unsigned short)(sum.red/sum.num); current_pixel.green = (unsigned short)(sum.green/sum.num); current_pixel.blue= (unsigned short) (sum.blue/sum.num); dstRIDX(i, j, dim) = current_pixel; 從上述運行截圖可以看出,減少函數調用確實起到了優(yōu)化代碼的作
15、用,但是優(yōu)化效果不明顯,可能是編譯器在編譯的時候做了優(yōu)化的緣故所以人為的優(yōu)化性能提升不多,但是減少函數調用確實可以達到優(yōu)化代碼的效果。優(yōu)化2:對圖片進行分塊處理,像素點分成圖片四個角、圖片四條邊、圖片內部三塊分別進行處理。對角而言只需要4個像素點的均值,對于邊而言為6個像素點均值,圖片內部則需要9個像素點均值。這樣可以減少循環(huán)判斷的次數,而且原代碼的avg函數是在一次循環(huán)中只進行一個像素點的累加,avg函數里用了兩重循環(huán),而函數主體有有兩重循環(huán),相當于原代碼用了四重循環(huán),所以性能很差,所以改進后不使用avg函數,并且通過分塊,將每個分塊周圍的像素點一次性加起來而不是一個循環(huán)累加一個像素點,達到
16、大大減少循環(huán)調用的功能。void smooth(int dim, pixel *src, pixel *dst) int i,j,lastr,lastb,lastg;int row = dim;int curr;/四個角處理 dst0.red=(src0.red+src1.red+srcdim.red+srcdim+1.red)>>2;/用">>"代替"/4"節(jié)省時間dst0.blue=(src0.blue+src1.blue+srcdim.blue+srcdim+1.blue)>>2;dst0.green=(src0
17、.green+src1.green+srcdim.green+srcdim+1.green)>>2;dstdim-1.red=(srcdim-1.red+srcdim-2.red+srcdim*2-2.red+srcdim*2-1.red)>>2;dstdim-1.blue=(srcdim-1.blue+srcdim-2.blue+srcdim*2-2.blue+srcdim*2-1.blue)>>2;dstdim-1.green=(srcdim-1.green+srcdim-2.green+srcdim*2-2.green+srcdim*2-1.green
18、)>>2;dst(dim-1)*dim.red=(src(dim-1)*dim.red+src(dim-1)*dim+1.red+src(dim-2)*dim.red+src(dim-2)*dim+1.red)>>2;dst(dim-1)*dim.blue=(src(dim-1)*dim.blue+src(dim-1)*dim+1.blue+src(dim-2)*dim.blue+src(dim-2)*dim+1.blue)>>2;dst(dim-1)*dim.green=(src(dim-1)*dim.green+src(dim-1)*dim+1.gree
19、n+src(dim-2)*dim.green+src(dim-2)*dim+1.green)>>2;dstdim*dim-1.red=(srcdim*dim-1.red+srcdim*dim-2.red+src(dim-1)*dim-1.red+src(dim-1)*dim-2.red)>>2;dstdim*dim-1.blue=(srcdim*dim-1.blue+srcdim*dim-2.blue+src(dim-1)*dim-1.blue+src(dim-1)*dim-2.blue)>>2;dstdim*dim-1.green=(srcdim*dim-
20、1.green+srcdim*dim-2.green+src(dim-1)*dim-1.green+src(dim-1)*dim-2.green)>>2; /四條邊f(xié)or (j=1; j < dim-1; j+) dstj.red=(srcj.red+srcj-1.red+srcj+1.red+srcj+dim.red+srcj+1+dim.red+srcj-1+dim.red)/6; dstj.green=(srcj.green+srcj-1.green+srcj+1.green+srcj+dim.green+srcj+1+dim.green+srcj-1+dim.gree
21、n)/6; dstj.blue=(srcj.blue+srcj-1.blue+srcj+1.blue+srcj+dim.blue+srcj+1+dim.blue+srcj-1+dim.blue)/6; for (j=dim*(dim-1)+1; j < dim*dim-1; j+) dstj.red=(srcj.red+srcj-1.red+srcj+1.red+srcj-dim.red+srcj+1-dim.red+srcj-1-dim.red)/6; dstj.green=(srcj.green+srcj-1.green+srcj+1.green+srcj-dim.green+src
22、j+1-dim.green+srcj-1-dim.green)/6; dstj.blue=(srcj.blue+srcj-1.blue+srcj+1.blue+srcj-dim.blue+srcj+1-dim.blue+srcj-1-dim.blue)/6; for (i=dim; i < dim*(dim-1); i+=dim) dsti.red=(srci.red+srci-dim.red+srci+1.red+srci+dim.red+srci+1+dim.red+srci-dim+1.red)/6; dsti.green=(srci.green+srci-dim.green+sr
23、ci+1.green+srci+dim.green+srci+1+dim.green+srci-dim+1.green)/6; dsti.blue=(srci.blue+srci-dim.blue+srci+1.blue+srci+dim.blue+srci+1+dim.blue+srci-dim+1.blue)/6; for (i=dim+dim-1; i < dim*dim-1; i+=dim) dsti.red=(srci.red+srci-1.red+srci-dim.red+srci+dim.red+srci-dim-1.red+srci-1+dim.red)/6; dsti.
24、green=(srci.green+srci-1.green+srci-dim.green+srci+dim.green+srci-dim-1.green+srci-1+dim.green)/6; dsti.blue=(srci.blue+srci-1.blue+srci-dim.blue+srci+dim.blue+srci-dim-1.blue+srci-1+dim.blue)/6; /圖片內部 for(i=1;i<dim-1; i+)lastr=srcrow-dim.red+srcrow-dim+1.red+srcrow-dim+2.red+srcrow.red+srcrow+1.
25、red+srcrow+2.red+srcrow+dim.red+srcrow+dim+1.red+srcrow+dim+2.red;lastb=srcrow-dim.blue+srcrow-dim+1.blue+srcrow-dim+2.blue+srcrow.blue+srcrow+1.blue+srcrow+2.blue+srcrow+dim.blue+srcrow+dim+1.blue+srcrow+dim+2.blue;lastg=srcrow-dim.green+srcrow-dim+1.green+srcrow-dim+2.green+srcrow.green+srcrow+1.g
26、reen+srcrow+2.green+srcrow+dim.green+srcrow+dim+1.green+srcrow+dim+2.green;dstrow+1.red=lastr/9;dstrow+1.blue=lastb/9;dstrow+1.green=lastg/9;for(j=2;j<dim-1;j+)curr=row+j;lastr=lastr-srccurr-dim-2.red+srccurr-dim+1.red-srccurr-2.red+srccurr+1.red-srccurr+dim-2.red+srccurr+dim+1.red;lastb=lastb-srccurr-dim-2.blue+srccurr-dim+1.blue-srccurr-2.blue+srccurr+1.blue-srccurr+dim-2.blue+srccurr+dim+1.blue;lastg=lastg-srccurr-di
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 足部按摩技能打造專業(yè)按摩師必學內容
- 非專業(yè)人士如何輕松操作實驗儀器指南
- 財務管理軟件優(yōu)化提升企業(yè)運營效率的關鍵
- 2025年大唐華銀電力股份有限公司高校畢業(yè)生招聘筆試參考題庫附帶答案詳解
- 金融科技對傳統(tǒng)金融業(yè)的影響及前景分析報告
- 淮安專版2024中考歷史復習方案第06課時遼宋夏金元時期:民族關系發(fā)展和社會變化課時提分練習
- 超鏈接在客戶服務中的應用與優(yōu)化
- 課標專用天津市2024高考英語二輪復習滾動題組7單項填空書面表達
- 西藏2025年01月2025年西藏公務員考試(385人)國家公務員考試消息筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 跨學科教育培養(yǎng)全面發(fā)展的現代人才
- 《網絡攻擊與防御》課件第四章 基于系統(tǒng)的攻擊與防御
- 供電一把手講安全課
- JTG∕T F30-2014 公路水泥混凝土路面施工技術細則
- 建設工程施工專業(yè)分包合同(GF-2003-0213)
- 司法心理學課件
- 耳鼻喉科各項規(guī)章制度
- 湖南科技職業(yè)學院單招職業(yè)技能測試參考試題庫(含答案)
- 玻璃分化板制作工藝
- 減鹽減油健康教育
- 電動平車使用說明書
- 2024年智能鑄造生產線項目建設方案
評論
0/150
提交評論