perflab实验报告(CSAPP)
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;
…… 此处隐藏:3239字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [互联网资料]2022年厦门大学机电工程系824机械设计
- [互联网资料]东南大学2022年硕士研究生拟录取名单公
- [互联网资料]能源调研报告(精选多篇)
- [互联网资料]初三英语下学期 中考英语 语法填空训练
- [互联网资料]2022内蒙古选调生行测常识备考:新事物
- [互联网资料]自驾必备!在新西兰租什么样的车自驾游
- [互联网资料]佛教素食菜谱44页未完
- [互联网资料]盈利能力分析外文翻译
- [互联网资料]2022年南昌航空大学音乐学院736马克思
- [互联网资料]优选外贸跟单实习报告总结(精品版)
- [互联网资料]银行新员工培训总结
- [互联网资料]2_year_visa_new_guidance_190316
- [互联网资料]天津市五校宝坻一中静海一中杨村一中芦
- [互联网资料]2007--2008学年第一学期高三数学宁波市
- [互联网资料]Chromatic framework for vision in ba
- [互联网资料]幼儿园大班上学期美术教案《心愿树》含
- [互联网资料]2022年华中农业大学信息学院820微型计
- [互联网资料]硬盘坏道的表现 __硬盘使用久了
- [互联网资料]江苏省2016年会计从业资格考试《会计基
- [互联网资料]公共场所卫生监督试卷全解
- 高级英语第一册所有修辞方法及例子总结
- 综合交通枢纽规划与城市发展
- 沃尔玛的企业文化案例分析
- 美国Thanksgiving Day 感恩节 介绍
- PEP六年级英语上册Unit6How do you fee
- 最齐全的中国大型商场购物中心名单
- 数据结构实验报告八—哈夫曼编译码
- 杭州市余杭区人民政府(通知)
- 七年级语文成语运用专项训练
- 微观经济学第三章 消费者行为 课后习题
- 对_钱学森之问_的思考
- Excel_三级联动_下拉菜单
- 办公用品需求计划申请表
- 对外汉语教材必须要知道的发展史
- 挑战杯大学生学术科技作品竞赛作品申报
- 举办民办教育培训机构应具备下列条件
- 太阳能路灯项目设计方案
- 2013年八年级上最新人教版新教材Unit3I
- 【历史】 6-4 《近代科学之父牛顿》 课
- 高中生物《第四章 第二节 探讨加酶洗衣




