1 物理地址tag/set/block_offset说明:
1.1 以 2路组相连cache为例子介绍cache行和物理地址行的构成
上图是2路组相连的cache(引自https://www.sciencedirect.com/topics/computer-science/set-associative-cache)。
(直接映射cache也被称为单路cache的原因就是因为只有1路。)
1.1.1 cache的一行构成
tag | data block | flag bits |
- tag: 标签位用于比较在way1和way0两路中,哪一个cache块存了我们的目的数据(可以看到图中的两个等号的用硬件实现的比较器,就是用来比较way1 and way0中的两个tag的)
- data block: 数据位用来存储(内存和cache交换的数据块)目标tag的数据块。
- v: 有效位用来 表示该cache块是否有效。(复杂的cache设计可能有更多位)(比如当一开始cache里面一个数据块都没有为空的时候,所有的v标记都为0,然后当该数据块载入了,代表该块有效了,那么将其置为1即可。)
1.1.2 要去cache中找数据的内存地址
一个地址构成如下图: 左侧为MSB,右侧为LSB(lowest significant bits):
tag | index | block offset |
- block offset: 说的是对于内存地址来说,其后block offset个字节的数据会构成一个和cache做数据交换的块,故就是cache块的大小;
- index: 说的是对于内存地址来说,其应该被映射到cache里的哪一组,故该部分的位数代表的是整个cache能hold住多少组,而组数目又由每个cache块大小和(4路组相连那路数就是4)“路数”有关的,其计算方式为:
s e t N u m s = c a c h e W h o l e S i z e ( n u m O f W a y s ) ∗ ( b l o c k S i z e ) ) setNums = \frac{cacheWholeSize}{(numOfWays) * (blockSize))} setNums=(numOfWays)∗(blockSize))cacheWholeSize
拿最开始的2路组相连来说,其中的MemoryAddress里的set我们看到了是2位,那么这个内存地址就可以根据set的两位去找到自己在cache中对应的组是哪一组,拿图中来说,当set的两位为10时,那么对应到第3组set2。 - tag: 用来在使用index选出cache位于哪一组后去比较具体的cache块位于哪一路。
2 结合实际例子
2.1 example1
一个四路相联cache,CPU字长为4字节,内存和cache都是以字节编址,cache和内存交换单位为块,每个块大小为512字节,cache能够容纳1024个块。如果物理内存为32位地址:
- q1: 画出cache和内存的地址格式,标明块内偏移地址、组号和标签位置;
- q2: 请计算内存地址FAB12389(16进制)在cache中可能的位置块号;
answer q1:
根据1.1.2的计算方式:
s
e
t
N
u
m
s
=
c
a
c
h
e
W
h
o
l
e
S
i
z
e
(
n
u
m
O
f
W
a
y
s
)
∗
(
b
l
o
c
k
S
i
z
e
)
)
=
1024
∗
512
B
y
t
e
4
∗
512
B
y
t
e
=
2
8
setNums = \frac{cacheWholeSize}{(numOfWays) * (blockSize))} = \frac{1024*512 Byte}{4*512Byte} = 2^{8}
setNums=(numOfWays)∗(blockSize))cacheWholeSize=4∗512Byte1024∗512Byte=28
故,最后的结果如下:
tag(32-8-9=17bit) | index(8bit) | block offset(9bit) |
answer q2:
其内存地址分成4个Byte分别是:
FA(1111 1010) | B1(1011 0001) | 23(0010 0011) | 89(1000 1001) |
根据q1的结果,我们容易得出其tag,index和blockoffset对应的值分别如下:
tag(32-8-9=17bit) = (don't care) | index(8bit)= 1001 0001(B) = 128+16+1=145(D) | block offset(9bit) = 1 1000 1001(B) |
145*4 + (0,1,2,3) = 580,581,582,583块
2.2 example2 [2]
An Example
A computer uses 32-bit byte addressing. The computer uses a 2-way associative cache with a capacity of 32KB. Each cache block contains 16 bytes. Calculate the number of bits in the TAG, SET, and OFFSET fields of a main memory address.
Answer
Since there are 16 bytes in a cache block, the OFFSET field must contain 4 bits (24 = 16). To determine the number of bits in the SET field, we need to determine the number of sets. Each set contains 2 cache blocks (2-way associative) so a set contains 32 bytes. There are 32KB bytes in the entire cache, so there are 32KB/32B = 1K sets. Thus the set field contains 10 bits (210 = 1K).
Finally, the TAG field contains the remaining 18 bits (32 - 4 - 10). Thus a main memory address is decomposed as shown below.
18 | 10 | 4 |
TAG | SET | OFFSET |