




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、課程實驗報告 課 程 名 稱: 計算機(jī)組成與結(jié)構(gòu) 實驗項目名稱: perflab-handout 專 業(yè) 班 級: 姓 名: 學(xué) 號: 指 導(dǎo) 教 師: 楊科華 完 成 時 間: 2016 年 5 月 27 日信息科學(xué)與工程學(xué)院實驗題目:perflab程序性能調(diào)優(yōu)實驗?zāi)康模豪斫饩幾g器,學(xué)習(xí)程序優(yōu)化,從優(yōu)化程序代碼和程序執(zhí)行速度兩方面著手。實驗要求:本次實驗,要求針對每個函數(shù)、每個人均至少寫出3種優(yōu)化版本、并根據(jù)driver報告的結(jié)果進(jìn)行性能分析實驗環(huán)境: ubuntu-15.10、 x32系統(tǒng) 、VMware workstation實驗內(nèi)容及操作步驟:
2、60; 將下載下來的 kernels.c 中的 rotate、smooth 函數(shù)進(jìn)行優(yōu)化。 rotate函數(shù)的作用是將圖像逆時針旋轉(zhuǎn)90°,smooth函數(shù)的作用是對于圖像中的每一個像素點,取它和周圍的像素點的平均值,讓圖片變得模糊。下面對代碼進(jìn)行逐一優(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)將所有的像素進(jìn)行行列調(diào)位、導(dǎo)致整幅圖畫進(jìn)行了 90 度旋轉(zhuǎn)。然而分析一下代碼就能發(fā)現(xiàn)一個十分簡單的優(yōu)化方法:因為在最內(nèi)層循環(huán)中,j的值每次都會改變,所以每執(zhí)行一次賦值就要計算一次dim-1-j,算多了自然就慢了。我們可以利用簡單的數(shù)學(xué)技巧改寫公式,將賦值語句改成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)化結(jié)果如下:這是一種最為簡單的優(yōu)化方案,由圖可知,速度提升不大,性能優(yōu)化結(jié)果也不是很好。再分析源代碼,從 cache 友好性來分析,這個代碼的效率機(jī)會很低, 所以按照 cache 的大小, 應(yīng)在存儲的時候進(jìn)行 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)化結(jié)果如下:用分塊的方式,進(jìn)行優(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)化結(jié)果如下:分成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)化結(jié)果如下:用循環(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)分析這段代碼很多次地調(diào)用 avg 函數(shù),而 avg 函數(shù)內(nèi)也頻繁調(diào)用 initialize_pixel_
13、sum 、 accumulate_sum、assign_sum_to_pixel 這幾個函數(shù),且含有 2 層 for 循環(huán)。雖然會以損害程序的模塊性為代價,但消除函數(shù)調(diào)用的時間開銷,得到的代碼運行速度會快得多。所以,需要改寫代碼,不調(diào)用 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)化結(jié)果如下: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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 加裝電梯加盟合同范本
- canying勞動合同范本
- 剝離工程合同范本
- 保理 保證合同范本
- 養(yǎng)鵝訂單合同范本
- 中介居間服務(wù)合同范本
- 催收咨詢服務(wù)合同范例
- 加工制作維修合同范例
- 保安服務(wù)合同補(bǔ)充合同范本
- 加盟店餐飲合同范例
- 2022-2023學(xué)年江蘇省揚州市普通高校高職單招綜合素質(zhì)測試題(含答案)
- 小學(xué)科學(xué)教科版三年級下冊全冊課課練習(xí)題(2023春)(附參考答案)
- DB37T 4242-2020水利工程建設(shè)項目代建實施規(guī)程
- 學(xué)生班級衛(wèi)生值日表模板下載
- 《是誰覺醒了中國》
- 勞務(wù)派遣服務(wù)方案與服務(wù)流程圖
- 初一經(jīng)典、勵志主題班會PPT(共63張PPT)
- 兒童血尿的診斷思路
- 2022立足崗位秉承工匠精神PPT課件模板
- 第六章-政策過程及其理論模型-《公共政策學(xué)》課件
- 《行政組織學(xué)通論》配套教學(xué)課件
評論
0/150
提交評論