关于Cache的计算

关于Cache的计算



direct-mapped-Cache

每个主存地址对应到Cache中一个确定的地址(多(内存地址)对一(Cache地址))

一个CPU给出的地址:

地址结构 Tag Index 字节内偏移量
作用 与Cache中AdressSpeicher中的值比较 定位到某一个Cache Zeile(有 2 ^ n 行则需要n位Index ) 定位到



1. 计算一个Cache的总位数

假设:

  • 32位字节地址
  • direct-mapped-cache
  • cache有 (2 ^ n) 个Block,即有(2 ^ n)行 –> n位被用作Index
  • 一个Block大小为 (2 ^ m) 个word(有 2 ^ (m + 2) 个Byte ), 因此用 m 位来查找块中的字, 2位是字节偏移信息。

–> 标记域(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     



2. 将一个地址映射到Cache中

考虑一个Cache中有64个Block,每个16 Byte,那么地址为1200将被映射到Cache中的哪一块?

块由下面公式给出

    (块地址) mod (cache的块数)

其中块地址为:

    内存地址 / 每块字节数

注意:这个块地址对应的是 (字节地址 / 每块字节数) * 每块字节数(字节地址 / 每块字节数) * 每块字节数 + (每块字节数 - 1) 之间的内存地址。

因此,由于每块有16 Byte,所以地址为1200对应的块地址为:

    1200 / 16 = 75

对应于Cache中的编号为 75 mod 64 = 11 的Block。

事实上,地址从1200到1215之间的所有地址都映射在这一块。



Set-associative-cache

direct-mapped-cache 和 fully-associative-cache的合体:

  • 先用direct-mapped-cache 的方法定位到某一个set

  • 然后再在这个set里用 fully-associative-cache 去比较tag来判断是否命中(Cache hit)


用Set-associative-cache看direct-mapped-cache 和 fully-associative-cache

  • direct-mapped-cache 是一个简单的 一路相联的Cache(每个set里只有一个Block)

  • 有m项的fully-associative-cache 可以看成是一个简单的 m路相联的Cache:只有一个set,set里有m个Block。


标记位(Tag)大小与Set-associative-cache

回想 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

Aus Folien

  • Anzahl der Cache-Zeilen:

        Cache-Zeilen = Cache-Kapazität / Blockgröße
    


你可能感兴趣的:(计算机结构)