perflab实验报告(CSAPP)
更新时间:2024-01-29 04:25:01 阅读量: 教育文库 文档下载
- perflab实验推荐度:
- 相关推荐
Perflab优化实验
【实验目的】
理解编译器,学习程序优化,从优化程序代码和程序执行速度两方面着手。
【实验原理】 通过循环展开、cache友好、替换变量等手段来实现程序优化。
【实验内容】
将下载下来的kernels.c中的rotate、smooth函数进行优化。
【操作界面】
从网上下载了SSH Secure Shell Client和SSH Secure File Transfer Client代替Putty作为实验平台,可以方便的进行文件上传与下载,所以此次实验以本地编辑文件,再上传覆盖原文件运行为主。软件界面如下:
通过在SSH Secure Shell Client将压缩包解压之后,可以直接通过SSH Secure File Transfer Client下载所需要的kernels.c文件,无需通过cmd输入长指令进行下载。
改好的kernel.c也只需通过SSH Secure File Transfer Client,右击upload即可。
【程序优化】
1. Naive_rotate
1-1.原始代码
char naive_rotate_descr[] = \void naive_rotate(int dim, pixel *src, pixel *dst) {
int i, j;
for (i = 0; i < dim; i++)
for (j = 0; j < dim; j++) dst[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)]; }
1-2.分析
这段代码的作用就是将所有的像素进行行列调位、导致整幅图画进行了90度旋转。P从defs.h中可以找到 #define RIDX(i,j,n) ((i)*(n)+(j)) 。
代码从阅读性上来说,这段代码非常具有可读性,但是,从cache友好性来说,这段代码则显得难以接受。所以考虑到cache的大小,应在存储的时候进行32个像素依次存储(列存储)。这样可以做到cache友好、可以大幅度提高效率。
1-3.优化代码
char rotate_descr[] = \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++; //共31组 *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;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;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++; src-=(dim<<5)-dim; //src -= 31*dim dst-=31+dim; }
dst+=dst_base+dim; dst+=32;
src+=(dim<<5)-dim; //src +=31*dim } }
2. Naive_smooth
2-1. 原始代码
void naive_smooth(int dim, pixel *src, pixel *dst){ int i, j;
for (i = 0; i < dim; i++) {
for (j = 0; j < dim; j++) {
dst[i*dim+j] = avg(dim, i, j, src); } } }
2-2.分析
这段代码频繁地调用avg函数,并且avg函数中也频繁调用initialize_pixel_sum 、accumulate_sum、assign_sum_to_pixel这几个函数,且又含有2层for循环,而我们应该减少函数调用的时间开销。所以,需要改写代码,不调用avg函数。
Smooth函数处理分为4块,一为主体内部,由9点求平均值;二为4个顶点,由4点求平均值;三为四条边界,由6点求平均值。从图片的顶部开始处理,再上边界,顺序处理下来,其中在处理左边界时,for循环处理一行主体部分,于是就有以下优化的代码。
2-3.优化代码
char smooth_descr[] = \void smooth(int dim, pixel *src, pixel *dst) { int i,j; int dim0=dim; int dim1=dim-1; int dim2=dim-2;
pixel *P1, *P2, *P3; pixel *dst1; P1=src; P2=P1+dim0; //左上角像素处理 dst->red=(P1->red+(P1+1)->red+P2->red+(P2+1)->red)>>2; dst->green=(P1->green+(P1+1)->green+P2->green+(P2+1)->green)>>2; dst->blue=(P1->blue+(P1+1)->blue+P2->blue+(P2+1)->blue)>>2; dst++; //上边界处理 for(i=1;i dst->red=(P1->red+(P1+1)->red+(P1+2)->red+P2->red+(P2+1)->red+(P2+2)->red+P3->red+(P3+1)->red+(P3+2)->red)/9; dst->green=(P1->green+(P1+1)->green+(P1+2)->green+P2->green+(P2+1)->green+(P2+2)->green+P3->green+(P3+1)->green+(P3+2)->green)/9; dst->blue=(P1->blue+(P1+1)->blue+(P1+2)->blue+P2->blue+(P2+1)->blue+(P2+2)->blue+P3->blue+(P3+1)->blue+(P3+2)->blue)/9; dst1->red=((P1+3)->red+(P1+1)->red+(P1+2)->red+(P2+3)->red+(P2+1)->red+(P2+2)->red+(P3+3)->red+(P3+1)->red+(P3+2)->red)/9; dst1->green=((P1+3)->green+(P1+1)->green+(P1+2)->green+(P2+3)->green+(P2+1)->green+(P2+2)->green+(P3+3)->green+(P3+1)->green+(P3+2)->green)/9; dst1->blue=((P1+3)->blue+(P1+1)->blue+(P1+2)->blue+(P2+3)->blue+(P2+1)->blue+(P2+2)->blue+(P3+3)->blue+(P3+1)->blue+(P3+2)->blue)/9; dst+=2;dst1+=2; P1+=2;P2+=2;P3+=2; } for(;j dst->red=(P1->red+(P1+1)->red+(P1+2)->red+P2->red+(P2+1)->red+(P2+2)->red+P3->red+(P3+1)->red+(P3+2)->red)/9; dst->green=(P1->green+(P1+1)->green+(P1+2)->green+P2->green+(P2+1)->green+(P2+2)->green+P3->green+(P3+1)->green+(P3+2)->green)/9; dst->blue=(P1->blue+(P1+1)->blue+(P1+2)->blue+P2->blue+(P2+1)->blue+(P2+2)->blue+P3->blue+(P3+1)->blue+(P3+2)->blue)/9; dst++; P1++;P2++;P3++; } //右侧边界处理 dst->red=(P1->red+(P1+1)->red+P2->red+(P2+1)->red+P3->red+(P3+1)->red)/6; dst->green=(P1->green+(P1+1)->green+P2->green+(P2+1)->green+P3->green+(P3+1)->green)/6; dst->blue=(P1->blue+(P1+1)->blue+P2->blue+(P2+1)->blue+P3->blue+(P3+1)->blue)/6; dst++; P1+=2; P2+=2; P3+=2; } //左下角处理 dst->red=(P1->red+(P1+1)->red+P2->red+(P2+1)->red)>>2; dst->green=(P1->green+(P1+1)->green+P2->green+(P2+1)->green)>>2; dst->blue=(P1->blue+(P1+1)->blue+P2->blue+(P2+1)->blue)>>2; dst++; //下边界处理 for(i=1;i dst->green=(P1->green+(P1+1)->green+(P1+2)->green+P2->green+(P2+1)->green+(P2+2)->green)/6; dst->blue=(P1->blue+(P1+1)->blue+(P1+2)->blue+P2->blue+(P2+1)->blue+(P2+2)->blue)/6; dst++; P1++; P2++; } //右下角像素处理 dst->red=(P1->red+(P1+1)->red+P2->red+(P2+1)->red)>>2; dst->green=(P1->green+(P1+1)->green+P2->green+(P2+1)->green)>>2; dst->blue=(P1->blue+(P1+1)->blue+P2->blue+(P2+1)->blue)>>2; } 于是最终得到: 附分路并行的各种结果: 1)不分 2)分2路 3)分3路 4)分4路 分路并行,并不是分路越多越好,执行加法和除法的功能单元是流水化操作的,而他们的个数也有限,超过其最大负荷也会让程序执行速率减慢。 【实验心得】 通过本次实验,我理解了代码优化的一些手段,编写出更具效率的代码。然而更重要的是更好地理解了计算机的工作原理,使我们以后编写代码的时候具有能结合硬件思考的能力。
正在阅读:
perflab实验报告(CSAPP)01-29
WLAN协议03-09
市长在城市建设工作推进会议上的讲话06-19
带状孢疹痒 你知道怎么办吗01-11
华容道经典布局及变化规律图解大全06-12
2014年龙东地区初中毕业学业考试化学学科考试说明06-10
无砟轨道施工作业指导书105-19
2011年国考申论真题含答案省级以上(含副省级)综合管理类 - 图文01-19
2015—2016专业技术人员心理健康与心理调适公需科目考试答案最全版本03-14
高效污水处理工艺智能化控制系统的设计07-21
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- perflab
- 实验
- 报告
- CSAPP
- COD的快速测定-实验讲义
- 一个房地产操盘手的十个瞬间 - 图文
- JSP学期授课计划
- 上海市建设工程规划受理办事指南
- 温州市市区建筑工程建筑面积计算若干问题规定的通知温政办〔2008〕74号
- 高中英语北师大版版必修2:Unit5 Rhythm-Warm-up and lesson1 Performance
- 义乌市小学2011年义乌市小学生信息学奥赛选拔赛试题
- 2009年-2013年山东省及全国摩托车整车产量数据统计报告
- 广告公司财务管理的调查报告
- 蛋白质测定方法
- 实验三P3.3口输入、P1口输出实验
- 园林工程学复习题
- 全国电子商务三创赛省赛优秀作品 - 图文
- 液压与气动课程设计说明书
- 2012年全国各地高考语文分类 - 病句
- 手术室护理质量评价标准
- 环境学概论第五次作业
- 理论力学N
- 心理毕业论文(35)
- 软系统方法论整理