深入理解计算机系统——实验 Perflab

一、前言

1、对程序进行优化时要使优化后得到的程序和未优化的版本有一样的行为。
2、不依赖与目标机器的的特性的常见代码优化方法有:消除循环的低效率、减少过程调用、消除不必要的存储器引用
3、这次实验主要对两个函数进行优化,rotate函数和smooth函数

深入理解计算机系统——实验 Perflab_第1张图片
rotate函数要求将二维矩阵逆时针旋转90度

深入理解计算机系统——实验 Perflab_第2张图片
深入理解计算机系统——实验 Perflab_第3张图片
smooth函数要求将二维矩阵中每个元素的值替换为周围相邻元素的算术平均值
4、To make life easier, you can assume that N is a multiple of 32
5、以下测试结果仅供参考

 

二、rotate函数的优化

1、原rotate函数
深入理解计算机系统——实验 Perflab_第4张图片
其中:
深入理解计算机系统——实验 Perflab_第5张图片

2、利用循环分块,一种基于分块的循环优化, 旨在通过存储器引用重新排序来减少高速缓存失效率, 以提高存储访问的局部性[1],这里分成4*4的小块
深入理解计算机系统——实验 Perflab_第6张图片
深入理解计算机系统——实验 Perflab_第7张图片

3、利用循环展开(loop unrolling),循环是很重要的的程序结构, 虽然在源代码中描述很紧凑, 但循环语句往往要占用很大部分计算时间[1],这里采用32*32分块,4*4路循环展开
深入理解计算机系统——实验 Perflab_第8张图片
深入理解计算机系统——实验 Perflab_第9张图片

4、利用循环分块、循环展开以及消除不必要的存储器引用( 在临时变量中存放结果,消除了每次循环迭代中从存储器中读出并将更新值写回的需要(这里不是特别确定)),这里采用32*1分块,32路循环展开
深入理解计算机系统——实验 Perflab_第10张图片
深入理解计算机系统——实验 Perflab_第11张图片
深入理解计算机系统——实验 Perflab_第12张图片

下图是每一块的图示

深入理解计算机系统——实验 Perflab_第13张图片
先将src第一块中(32行dim列)的第一列(32行)转为dst第一块(dim行32列)中的最后一行(32列),
再将src第一块中(32行dim列)的第二列(32行)转为dst第一块(dim行32列)中的倒数第二行(32列),
……
再将src第二块中(32行dim列)的第一列(32行)转为dst第二块(dim行32列)中的最后一行(32列),
……

 

三、smooth函数的优化

1、原smooth函数
深入理解计算机系统——实验 Perflab_第14张图片
其中:
深入理解计算机系统——实验 Perflab_第15张图片   深入理解计算机系统——实验 Perflab_第16张图片
深入理解计算机系统——实验 Perflab_第17张图片

深入理解计算机系统——实验 Perflab_第18张图片
深入理解计算机系统——实验 Perflab_第19张图片

 

2、减少函数调用,将min、max函数设为inline函数;利用临时变量存放结果。

深入理解计算机系统——实验 Perflab_第20张图片

深入理解计算机系统——实验 Perflab_第21张图片

没多大用

3、这里将循环展开,分析不同的avg情况,四个角附近有3个点,四个边附近有5个点,中央部分附近有8个点。

深入理解计算机系统——实验 Perflab_第22张图片
深入理解计算机系统——实验 Perflab_第23张图片

深入理解计算机系统——实验 Perflab_第24张图片

深入理解计算机系统——实验 Perflab_第25张图片

 

参考资料:

[1]李根.关于嵌入式计算系统程序性能分析优化的研究[J].电脑编程技巧与维护,2019,(1):145-147.
[2]https://wenku.baidu.com/view/6a28f22ddd3383c4bb4cd2cb.html?sxts=1554297762751
[3]https://wenku.baidu.com/view/3a21f02b82c4bb4cf7ec4afe04a1b0717fd5b3f9.html

你可能感兴趣的:(∨∨深入理解计算机系统,计算机系统,Perflab)