ICS cache lab总结

ICS cache lab总结


这个lab分为两部分:
  part A模拟实现一个cache,替换策略为LRU,大概200-300行左右,支持命令行输入。
  part B实现三个矩阵转置,对miss数目由要求。满分要求为

M N miss
32 32 300
64 64 1300
67 61 2000

part A

个人觉得有几个注意点:
1.题目没有规定cache的大小,所以要用指针动态分配内存C语言没有new和delete,所以要自己malloc和free分配释放内存。
2.注意要实现最近使用策略,我是使用一个全局变量记录“时间”来实现的。
3.注意地址可能超过int范围,要开long long记录地址!

part B

直接映射缓存,经计算发现容量为32 blocks,block size=8 elements。
大致思路是看看数据在cacha分布,减少冲突地分块,再用8个临时变量利用cache特性减少miss地批量读。

32×32

cache存下8行,所以分割为8*8的矩阵块。那么8 *8矩阵块在cache里面恰好没有冲突。miss最小。

64×64

首先本题没有32 *32那么显然,需要一个分析指标帮助做题,我认为,如果写的时候已经在缓存里了称为warm,否则为cold,那么用cold rate这个相对抽象的指标而非比较难以分析计算的miss rate来分析性能。

如果接着分割为8*8矩阵块,由于矩阵一行block变多,所以cache存不下8行而只存下4行,在A里面读取还好,B写会有严重的冲突。
改成4*4矩阵块,就浪费了一次读加载8个的特性,还是过不了。

所以即不能造成写的严重冲突,又不能浪费一次加载8个的特性才能通过测试,毕竟64* 64比较整齐,不像下一个题不容易理论分析所以要求低,所以理论分析容易,测试卡得很严。

那么一个优秀的思路是8* 8里面看成4个4* 4小块处理,注意块间可以互相利用已经加载的缓存的特性。
如果直接处理,那么可以分析得到。
A cold rate=2/4, B cold rate=4/4

讲一种几乎可以成功了的7.5分+/8分做法:
比如A11,A12,A21,A22在处理时候按照A11,A12,A22,A21顺序处理,这样虽然读A起来没有区别(A的cold rate不可优化了),但是写B时候可以减少miss。分析知A cold rate=2/4, B cold rate=3/4(写A12,A22到B不冲突,所以减少1)。还是过不了。

所以要过,B的cold rate也要优化到极限2/4。
但是没有思路,这个快要绝望的时候,希望的曙光出现地出乎意料,还记得writeup里的一句话吗?你不可以更改矩阵A的值,但是你可以对矩阵B做任何你喜欢的事情。

所以我们可以巧妙利用B已经加载进来的部分存数据而不引起新的miss!,想通了这一点,下面我们在这个指导思想下减少B的cold rate。首先读入A11,A12,以后我们把A12转置存进B12而非B21,这样就不会造成额外cold rate了,B暂时cold rate=1/4,请注意下面我们先读A21,把它的值往B12写,这之前把B12读出来往B21写,按行写,这样一来我们虽然造成了B的最后一个cold rate,但是这个不是浪费,因为为了B21,B22,迟早要加载进来,接下来再写B22就不必加载了。所以B的cold miss只有2/4,这样性能就达到了题目要求。

直观地举个例子(图就不画了,会意即可):

A 1 2     
  3 4

第一阶段(B: cold rate+ 1/4) 
B 1’ 2’
  * *

第二阶段(B: cold rate+ 1/4)
B 1’ 3’
  2’*
 
第三阶段(B: no other cold rate now :-))
B 1’ 3’
  2’ 4’ 

67×61

也是分块,要找出一个比较优的策略还是比较难的,先实现再说。
因为不整齐带来问题,实现需要特判剩余行列数目。
然后思想还是分块,尝试了不同块,虽然8 *8,4 *4或者简单组合不能同时避免A,B读写的严重冲突,但是因为满分要求低,所以还是换一换策略可以过的。但是要研究清楚比较优甚至最优的做法还是很困难很复杂。

你可能感兴趣的:(Computer,System)