每个主存地址对应到Cache中一个确定的地址(多(内存地址)对一(Cache地址))
一个CPU给出的地址:
地址结构 | Tag | Index | 字节内偏移量 |
---|---|---|---|
作用 | 与Cache中AdressSpeicher中的值比较 | 定位到某一个Cache Zeile(有 2 ^ n 行则需要n位Index ) | 定位到 |
假设:
–> 标记域(Tag)的大小为:
32 - (n + m + 2)
direct-mapped-cache的总位数为:
(行数) * (block大小 + Tag大小 + 有效位大小)
所以上面的cache总位数为:
(2 ^ n) * (2 ^ (m + 2) * 8 + (32 - m - n - 2) + 1)
上面计算的是实际的大小,但通常对Cache命名只考虑==数据的大小(Datenspeicher的容量)==不考虑标记域和有效位域的大小。
例:
一个direct-mapped-cache,有16kB的数据,块大小为4个word,地址为32位,那么该cache总共需要多少位?
一个Block有4个word,每个word为4Byte
–> 每个Block大小为:
4 * 4 = 16 Byte = (2 ^ 4) Byte
Datenspeicher有 16 = (2 ^ 14)B 数据,每个Block大小为 (2 ^ 4) Byte
–> Block的数目为:
(2 ^ 14)/ (2 * 4) = 2 ^ 10
–> Index域大小为 10 位
每个Block中有 4 个Word ———> 定位到一个Word需要 2 位
每个word中有4个Byte ———–> 定位到一个Byte需要 2 位
所以标记域(Tag)的大小为:
32 - 10 - 2 - 2 = 18 bit
所以总共需要的位数:
(2 ^ 10) * ((4 * 4 * 8) + (32 - 10 - 2 - 2) + 1)
= (2 ^ 10) * 147
= 147 kbit
考虑一个Cache中有64个Block,每个16 Byte,那么地址为1200将被映射到Cache中的哪一块?
块由下面公式给出
(块地址) mod (cache的块数)
其中块地址为:
内存地址 / 每块字节数
注意:这个块地址对应的是 (字节地址 / 每块字节数) * 每块字节数
到 (字节地址 / 每块字节数) * 每块字节数 + (每块字节数 - 1)
之间的内存地址。
因此,由于每块有16 Byte,所以地址为1200对应的块地址为:
1200 / 16 = 75
对应于Cache中的编号为 75 mod 64 = 11
的Block。
事实上,地址从1200到1215之间的所有地址都映射在这一块。
direct-mapped-cache 和 fully-associative-cache的合体:
先用direct-mapped-cache 的方法定位到某一个set
然后再在这个set里用 fully-associative-cache 去比较tag来判断是否命中(Cache hit)
direct-mapped-cache 是一个简单的 一路相联的Cache(每个set里只有一个Block)
有m项的fully-associative-cache 可以看成是一个简单的 m路相联的Cache:只有一个set,set里有m个Block。
回想 direct-mapped-cache 一个存储块的位置是这样给出的
(块地址) mod (cache的块数)
而Set-associative-cache中包含存储块的set(组)的位置是这样给出的:
(块地址) mod (cache中的组数)
如果Cache总容量保持不变,提高关联度就增加了每组中的块数,也就是并行查找时间时比较的次数:==关联度每增加两倍会使每组块数加倍而组数减半==。相应地,==关联度每增加两倍,Index减少一位(组数减半), Tag增加一位(每组数目加倍)。==
在fully-associative-cache中,只有一组有效,所有块必须并行检测,因此没有Inex,只有Tag(除了块内偏移地址)
在direct-mapped-Cache中,只需要一个比较器,这是因为每一项只能对应Cache中唯一的块(有 2 ^ n 个Cache Zeile, Index 就是 n 位),通过索引就能简单的访问Cache。
Anzahl der zu vergleichenden Bits = Tag-Länge
例:假设一个Cache,有4K个块,块大小为4个Word,地址为32位。分别计算在直接映射,两路组相连,四路组相连,和全相连映射中,cache的总组数和总的标记位数。
因为一个块大小为4个word
–> 块大小为
4 * 4 = 16 Byte
需要2位来定位一个一个Block中的某个word(一个Block有4个word),需要两位来定位有一个word中的某个Byte(一个Word有4个Byte)
–> 用来提供索引和标记的位数总共有
32 - 2 -2 = 28 bit
直接映射
每个Set只有一个Block,所以组数和块数一样,都是4K个。
–> 定位到一个set需要
log (4K) = 12 bit
–> Index是12bit,Tag是 28 - 12 = 16 bit
,
–> 总的标记位数是
4K * 16 = 64K bit
2-Way、4-Way
关联度每增加一倍,组数减半,Index的位数减1,Tag位数加1.
所以2路中组的数量为 4K / 2 = 2K
, Index位数为 12 - 1 = 11
, Tag位数为 16 + 1 = 28 - 11 = 17
总的标记位数为
(28 - 11) * 2 * 2K = 68K
4路中组的数量为 2K / 2 = 1K
, Index位数为11 - 1 = 10
, Tag位数为 17 + 1 = 18
总的标记位数为:
(28 - 10)* 4 * 1K = 112K
全相联
只有一个有4K个Block的组 –> Tag是28位
总的标记位数为:
4K * 28 = 112K
Anzahl der Cache-Zeilen:
Cache-Zeilen = Cache-Kapazität / Blockgröße