目录
2. 测量分析出Cache 的层次结构、容量以及L1 Cache行有多少?
写在前面:
上交的实验报告需要包含账户的姓名全拼以及学号,本报告的相应部分已经打码处理,请在自己的环境中完成实验!
一、实验目的:
1. 加强对Cache工作原理的理解;
2. 体验程序中访存模式变化是如何影响cahce效率进而影响程序性能的过程;
3. 学习在X86真实机器上通过调整程序访存模式来探测多级cache结构以及TLB的大小。
二、实验环境:
X86真实机器
三、实验内容与步骤:
1. 分析Cache访存模式对系统性能的影响
(1)给出一个矩阵乘法的普通代码A,设法优化该代码,从而提高性能。
(2)改变矩阵大小,记录相关数据,并分析原因。
2. 编写代码来测量x86机器上(非虚拟机)的Cache 层次结构和容量
(1)设计一个方案,用于测量x86机器上的Cache层次结构,并设计出相应的代码;
(2)运行你的代码获得相应的测试数据;
(3)根据测试数据来详细分析你所用的x86机器有几级Cache,各自容量是多大?
(4)根据测试数据来详细分析L1 Cache行有多少?
3. 尝试测量你的x86机器TLB有多大?(选作)
四、实验过程及内容:
准备工作:
首先在虚拟机桌面上新建一个实验五的文件夹experiment_5用于保存本实验所用的所有文件。下载main_a.c文件后使用指令gcc -o main_a main_a.c 进行编译,发现没有错误。
图:编译main_a.c
图中,第一次编译错误是由于“-o”的命令出错,具体原因是ppt中给出的指令使用的符号并不是标准的“-”,而是“–”,导致机器无法识别。修改后即可正确编译并生成可运行文件。
接下来即可开始实验:
1. 分析Cache访存模式对系统性能的影响:
使用指令./main_a x,以x*x为矩阵的大小运行程序./main_a,并记录运行时间,填入表中(单位为秒)。
接下来阅读源代码,并尝试优化:
阅读代码可以得知,程序的主要功能是实现两个矩阵的相乘运算,将大小为x*x的矩阵a,b相乘的结果保存在矩阵c中。但此代码的空间局部性较差,常常访问距离当前访问地址较远的地址,具体而言,在对c某个位置的计算时,对矩阵b的访问中,程序每次访问的地址将会增加size,此时如果size较大,访问的空间将会距离较大,因此空间局部性差。
优化方法:将原始的整块矩阵相乘拆分为一个个小矩阵块相乘,从而提高了空间局部性,提高运行效率。计算部分的代码如图:
图:核心代码
其中,BLOCK_SIZE即为矩阵块的大小。
接下来,由于我们并不能直接确定块的合适大小,因此我尝试将此参数进行多次调整,找到一个较优的值:
图:参数调整过程