一、test-trans 64x64矩阵转置实验:
1、64×64矩阵,每行64元素,每8一组32位分8个组,故cache每4行填满整个cache。
2、测试传统8分块,结果如图,发块与不分快结果一样,没有优化。
这是因为A数组8x8读取数据的时候与之前一样,都是每组第一个miss以后hit,但是B数组按列存的时候,因为每四行一个块,在访问后四行的时候将前四行驱逐miss,然后访问第二列的时候又把第一列后四行驱逐miss,于是整个B数组均会miss。
2、设计新的8x8分块优化代码:
尽可能利用同一组的数据读取加大hit率,在8分块里细分成4块,结果如图:只有1179次miss,符合条件。
二、分析上述代码以及优化过程
1、优化代码及注释(包括具体过程):
2、组索引追踪与优化过程(根据上图):
第一步利用B数组右上角红色部分,先将A右上角转置到这里,B在读取时与蓝色部分组索引相同都是7-31,不会miss,第二步A先读取黄色部分,B读取此时B的右上角部分,然后A还原回B的右上角,B则将刚才存的右上角数据还原存回黄色左下角7-31索引处
最后将第四块绿色部分转置,而此时因为B黄色部分与绿色部分都是7-31索引,不会miss,最终只有B的冷miss存在,没有发生冲突,成功减少了大量miss数。
三、尝试61x67矩阵分块比较
1、分析61x67矩阵
该矩阵在cache参数为32位即8位数据一组的情况下不满足分块后一行就是一组的情况,会有分块之间的交叠之前的32x32及64x64都是8的倍数,容易达到分块效果。
2、记录多分块数据
16x16的结果如图:
根据大量测试得到下表所示的结果:
实际上一开始分块数增加miss大量减少,但是趋势在逐渐平缓,直到17分块以后反而miss增多,分析可以得知实际上块太大导致有组的重叠,且重叠数量会逐渐增大,此时17分块已经是最优结果。
一、cache实验信息整理
1、实验目标:学会cache的存储原理,利用Part A编写cache模拟器进一步学习miss,hit与eviction的原理,利用part B理解C语言程序对于cache存储的影响与实际的cache优化方法,理解cache运行过程。
2、实验资源:windows 10 64 bit pro,ubuntu 19.04 kylin
3、实验步骤:
1)、安装实验环境:sudo apt-get install valgrind安装valgrind。
2)、part A:编写一个cache模拟器csim.c,该模拟器可以模拟数据读(L)写(S)中cache的命中、不命中与牺牲行的情况,需要牺牲行时,用LRU算法进行替换并实现相关LRU,set,tag信息显示及cache运行过程。
命令2:模拟器获取对应cache参数在trace文件读取内容的命中情况:./csim-ref -v/h -s -E -b -t +trace :-s组索引的位数 -E:每一组的行数; -b:偏移位宽度。可以跟踪cache运行情况,可用来检验模拟器是否正常运行。
命令3:./test-csim:展示自带的参考模拟器与自己写的模拟器运行对比情况查看是否正确。
3)、part B:写4 x4,8x8分块以及对角线优化实现32x32,64x64矩阵转置的函数使函数调用过程中对cache的不命中数miss尽可能少。包括对于61x67矩阵分块的分析。
命令:./test-trans -M t -N t:生成t x t的矩阵作为cache测试样例(参数-s 5 -E 1 -s 5),得出trans.c文件中自己写的转置优化分块函数命中结果。
二、实验结果
因为Ubuntu 19.04自带python环境,不需要重新安装,直接使用命令./driver.py即可观察检验报告
结果解释:
1、Part A是./test-csim的结果与分数,自己的模拟器与实验自带的参考模拟器在所有测试模型中都有一样的数据,即相同的miss,hit,eviction数量,表示模拟器的正确设计,得分27分。
2、Part B即./test-trans -M t -N t命令的总结,代码中设计的函数达到了所有情况的标准,32x32,64x64以及61x67矩阵都比标准miss数少,即满分。
最终,一共获得53分,实验正确完成。
三、实验总结
1、学习的新知识:
由于实验比课堂早接触cache,相当于为课堂学习打下了基础。cache模拟器的设计加深了我们队cache运行情况的理解,了解了cache的读取、miss、hit、eviction与Lru算法。part B的实现让我了解到如何利用cache来提高C语言代码运行速度,这对于以后的编程也有很大的帮助,使程序cache亲和性更好,更适应现代处理器特色。
2、学习方法:
实验中参考了许多资料学习cache知识,因为一开始课堂上并没有讲过相应知识。最重要的学习方法这次获得的还是对代码的优化与修改,用合理的方法找到代码遗漏的地方。
3、获得技能:
本次实验获得的主要技能是对于实现同一个目的代码的优化,逐步想办法更进一步减少miss次数。同时,根据课程提示实现了cache模拟器,所以其实很多测试程序、模拟程序都可以作为辅助工具帮助理解或者是debug主要部分程序,这些工具都可以自行设计。
4、心得体会:
对cache理解不同,所得到的结果不同,但是经过深入讨论后我和我的搭档还是得到了一些统一的结论,这对于实验的顺利进行起到了莫大的帮助。