对不起,如果我在发布此信息时出错了。请让我知道是否需要更改任何内容。
我已经收到了计算机体系结构的作业,但我错过了这个问题。我的教授的解释对我来说没有意义,而且我不同意他告诉我的话,所以我在这里问你们的想法。
这是问题:
计算机使用16位内存地址。主内存为512KB
,缓存为1KB
,每个块为32B
。给定以下每个映射函数,计算内存地址每个字段中的位数。
这是我解决问题的直接映射部分的方式:
高速缓存存储器:1KB (2^10)
,16位存储器地址(1 word = 2B) -> 1024B/2B = 512 words
,每个块16个字(32B)
-> 512/16 = 32 cache memory blocks
。
主存储器:512 KB (2^19)
,16位存储器地址(1 word = 2B) -> 524288B/2B = 256K words
,每块(32B) -> 256K/16 = 16384 or 16K
主存储器块16个字。
我这样理解单词标签:每个块32B
允许每个块16 16-bit
个存储器地址。这(我相信)支持:每个块中的1 word = 16 bits = 2 B -> 32B/2B = 16 words
。这等于2^4 = 4 bits
用于确定块中的哪个字,而12 bits
则用于存储地址中的标记和块位。
现在,为了将16K
个主存储块直接映射到32
个高速缓存存储块中,将必须有512
个主存储块映射到每个高速缓存存储块。因此,每512/16K
个块中有1/32
个块。
在这里我很困惑。这样是否不需要9
标签位,就像2^9 = 512
(可能将主存储块映射到一个高速缓存存储块)一样?
对于指向缓存中特定块的块位,这需要5 bits
。 2^5 = 32
,缓存中的块。
这需要在内存地址中添加18 bits
。
这是我教授对这个问题的回答:
2^5 = 32 -> 5
字位
(1KB)/(32B)
= 32个块-> 5个块位
16 – 5 – 5 = 6
标记位
我没有意识到我可以简单地减去所需的块和字位来获得标签位。但这对我来说仍然没有意义。每个缓存块2^6 = 64 blocks
。 64*32
给出2048
。我无法解决这个问题。有人可以帮忙吗?
答案 0 :(得分:1)
好的,我学到的术语略有不同,但是对于这种解释,原理应该是相同的。
因此缓存将具有多个集合(有点像一个单元格)。每个集合将具有1个高速缓存行(包含1个数据块)或多个高速缓存行(每个均包含1个数据块)(直接映射或n关联映射)。
在将主内存块映射到缓存时,主内存地址(16位)分为3个字段:标签,索引位和偏移量位。一个存储单元为1个字节,一个块由几个单元组成
偏移量位用于访问存储块的各个字节。可以将其视为块基地址顶部的偏移量,以获取所需的字节(我认为您的内存应该是可字节寻址而不是可字寻址的,因为访问没有意义2B单词,因为这是不灵活的),在这里,您的教授/教科书将其称为单词位。因此,如果一个块具有32个字节,则需要log2(块大小)= 5位来访问映射块中的各个单元。
索引位(在直接映射的缓存中也称为块位,因为集合的数量与缓存中的块的数量相同)用于标识哪个集合 / cache line /缓存块,表示主内存块已映射到缓存。高速缓存中有1KB / 32B = 32个高速缓存块。 使用直接映射时,每个集合仅包含1个缓存块,因此此缓存中将有32个集合。因此,要访问缓存中的正确集,需要5位,因此索引位= 5位
标签是一个名称,用于确定高速缓存中的数据块是否是我们从主存储器中查找的正确数据块。由于主存储器的地址为16位,并且我们已经知道索引和偏移量字段,因此很容易推断出标签将需要16-5-5 6位。由于块大小和缓存大小(因此,此处给出了缓存中的集合数),我们真正确定标签的方式并不重要。