less than 1 minute read

1.cache基本概念

1.1Block

主存和cache间以及cache和CPU间复制数据的最小大小,通常为64B。

1.2cache hit&miss

以LLC为例,上级的cache如果在LLC中找到相应的块,就称为cache hit,就把相应的块复制到上级的cache中或者CPU中。相反,如果没有找到,就称为LLC miss,需要从主存里面复制相应的块到LLC或者直接到上级cache(根据inclusion的策略有区别)。

1.3Eviction

如果从LLC中复制了相应的块到上一级cache中,那么上一级cache中的块根据相应的替换策略进行块的替换或者叫驱逐。

2.cache locality

代码中的一部分指令常常会被经常使用,重复执行

for (i=0, i<N, i++){
  for (j=0, j<M, j++){
      ... Loop Body ...
  }     
}

其中的Loop Body称为热点,在一段时间会被不断执行,称为时间局部性。 时间局部性:如果一个块被访问了一定次数,接下来很有可能还会被访问。 空间局部性:如果一个块被访问了一定次数,那么很有可能其周围的块也会被访问。

3.cache

上面这个图是cache的概述。

3.1替换策略

Random:随即替换cache,可看出对性能的影响十分大。 LRU:需要每次访问进行更新;完全的LRU策略只能在small associates上实行(i.e 2 way) ; pseudo-LRU一般用于较大的associate(4-8 way) FIFO:highly associate cache MRU NMRU

3.2写策略

cache hit

write through:修改cache中块的值,并同时修改主存中相应块的值。

write back:修改 Cache 中的 Block 的数值后将此 Block 标记为 Dirty Block,但并不会立即修改主存中相对应的 Block 的数值,而是等到 Cache 中的此 Block 被驱逐時 (Eviction),才会修改主存中相对应的 Block 的数值。此方式有数据丢失的危险,但是速度较快。

cache miss

write allocate

將主存中含有想要写入的 Block 复制到 CPU Cache 中,并再修改 Cache 中该 Block 的数值后将该 Block 标记为 Dirty Block。

write no allocate

仅仅是写到主存中,不会被写回到cache中。

common combination

write through & write no allocate
write back & write allocate

3.3cacheline解释

上图是cache的组织方式,cache由set组成,set由line组成,cacheline由valid bit,tag,data组成,其中data是真正要缓存的内存地址中的数据,而tag是用来搜索cache line的标签。 内存地址分解如下:

内存地址被分成了3部分,tag,set index和block offset,这三部分分别用来在cache中定位数据。 cache根据寻址方式可以分为3类:

  • 直接映射(direct mapped cache),相当于每个set只有1个cache line。
  • 组相联(set associate cache):多个set,每个set中有n个cacheline,就称为n-way set cache
  • 全相连,即只有一个set

Tag 是用来区分不同的 Block 的标记。Valid Bit 是用来区分 一个 Block 里的资料是否为有效的。 Valid -> 1 Invalid -> 0
Cache 的大小的计算公式为: data bytes

sets

lines per set

bytes per cache block (data)

4.Inclusion&Exclusion

其中inclusive cache包含上一级的cache,因此如果由上一级cache的clean写回操作,直接复制就好,不需要写操作,对于exclusive不包含上一级cache的副本,因此不能避免dirty eviction。如果发生LLC miss,inclusive cache需要对LLC和L2同时进行write allocate,保证inclusive,对于exclusive则不需要。

5.cache miss(3C)

compulsory miss(cold cache)

  • 程序刚开始执行时,cache中没有任何的块,因此发生了cache miss

capacity miss

  • cache的容量太小了,没有办法覆盖到整个working set

conflict miss

  • 虽然 Cache 还有很多空间,但在 Working Set 中的 任意两个 Block 可能无法同时存在 Cache 中。发生的原因可能是因为,此 2 个 Block 的 Index 相同。(也就是所谓的 Cache Thrash)

Tags:

Categories:

Updated: