我对如何在2路关联缓存中访问数据感到困惑。
例如,C = ABS
C = 32KB
A = 2
B = 32bits
S = 256
offset = lg(B) = 5
index = lg(S) = 8
tag = 32 - offset - index = 19
说我有以下地址
tag | index | offset
1000 0000 0000 0000 000|0 0000 000|1 0000
1000 0000 0000 0000 000|0 0000 000|0 0000
1000 0000 0000 0000 000|0 0000 000|1 1010
我的缓存看起来像
index valid dirty tag data valid dirty tag data
0: 1 0 0x80... some data1 1 0 0x80... some data2
1: . .
2: . .
3: . .
当索引和标记位相同时,如何确定应从两个缓存阵列中的哪一个(数据1与数据2)中获取数据?
同样,当我需要使用相同的索引和标记位更新缓存时,如何确定应剔除两个数组中的哪些数据?
我认为这与偏移量位有关,但是我不太确定如何使用偏移量位,或者它们在缓存阵列中究竟代表或映射到什么位置。
当索引和标记位相同时,如何确定应从两个缓存阵列中的哪一个(数据1与数据2)中获取数据?
您的缓存如何进入这种状态?具有相同索引和标签的访问将被命中,而不是分配第二个条目。
由于虚拟索引(或标记)导致的同名或同义词问题,两次在缓存中使用相同的物理内存行(具有不同的索引或标签)可能会发生,但是这种情况在正确设计的缓存中是不可能的。
当我需要使用相同的索引和标记位更新缓存时,如何确定应删除两个数组中的哪些数据?
在这种情况下,您不驱逐;那是缓存命中。
索引选择一组标签。这两个标签(在您的情况下)与地址的标签位匹配。如果一个匹配,那就很成功。如果没有,那就太想念了。
因此,当您需要逐出现有行之一时,具有相同索引但具有不同标记的访问。通常的更换政策是LRU。实现此目的的一种方法是使集合中的位置重要。每次访问一条线时,其标签就会移到MRU位置。当必须从集合中逐出一条线时,就将LRU位置逐出。这将是最近最少访问的行。
通常,新添加的行位于MRU位置,但是自适应地添加到LRU位置可避免在遍历巨型阵列时驱逐有价值的数据。请参阅有关Intel IvyBridge的自适应L3替换策略的博客文章,以进行一些聪明的实验测试来研究硬件性能,并提供一些不错的解释。
我认为这与偏移位有关
不,偏移量位选择一行中的字节。命中/未命中/替换都无关紧要。高速缓存访问硬件使用偏移量和大小来选择找到右行后要读取或更新的字节范围。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句