perflab优化1

perflab优化1
一. 实验前的准备
搭建实验环境,在虚拟机中安装linux操作系统,安装gcc编译器,gdb调试环境,下载相关资料,阅读英文说明文档perflab.pdf,了解实验内容
二. 实验要求
修改kernel.c的源代码,对roate函数进行优化
查看Makefile文件中不同的make指令并用make编译生成可执行文件driver,用 . /driver测试修改后程序的加速比,分析其原因
对roate函数进行至少两种的不同优化版本
三. 实验过程

  1. 前面的准备工作
    首先我们需要将实验文件perflab.rar通过tool的工具导入到linux中
    然后我们需要修改文件中对应的信息,对文件进行补充
    perflab优化1_第1张图片
    在终端运行make clean清除上次编译的文件,
    接着运行make对修改过的代码进行编译,
    最后运行./driver运行程序
    查看终端的mean,mean代表本次实验的分数,越高越好
    perflab优化1_第2张图片
  2. 对代码进行优化(方法一)
    在这里插入图片描述

这是不进行任何优化情况下的mean值
源代码
perflab优化1_第3张图片
修改后
perflab优化1_第4张图片
在这里插入图片描述
修改后mean的值增长到27.4,说明优化比较显著

修改方法及优化的原因
方法:将对应的双重for循环的顺序进行改变
原因:内外循环顺序的改变导致运行时间不同的根本原因在于寻址时间的差异
对于rotate函数的语句:dst[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)];
其中等号前相当于写入地址,等号后相当于从地址中读。我们因尽量优化写的寻址,因此交换循环次序
3. 对代码进行优化(方法二)
在这里插入图片描述
这是不进行优化的mean的值
修改后的代码:
perflab优化1_第5张图片
在这里插入图片描述
修改后的mean值增长到了31.9,增长很明显

修改方法及优化的原因
方法:将对应的循环内容进行分块,分为8*8一块
原因:循环分块是对存在重用的循环嵌套的迭代空间进行分块,把较大的工作集分为若干个较小的部分,每一部分的大小均小于Cache,并使每一部分的数据在装入Cache后,都要在充分重用后才被替换出去,因此可以说循环分块是减少容量失效的一种有效方法。
4. 对代码进行优化(方法三)
在这里插入图片描述
这是不进行优化的mean的值
修改后的代码:
perflab优化1_第6张图片
在这里插入图片描述
修改后增到18.1,只是进行稍微的优化,效果不明显

修改方法及优化的原因
方法:换掉RIdx函数的调用,直接进行赋值运算
原因:在这里插入图片描述
我们可以在其他的文件中看到RIDX函数的定义,他是直接的公式运算 那么我们不需要再for循环中直接调用对应的函数,我们可以直接进行赋值,
减少函数调用,以此来减少运算量达到优化的目的

你可能感兴趣的:(perflab优化1)